Maison  >  Questions et réponses  >  le corps du texte

Concaténer des dates consécutives dans des chaînes de date

J'ai une chaîne avec des dates séparées par des virgules et je souhaite calculer si des dates uniques sont connectées.

La liste pourrait donc être :

2022-07-15, 2022-07-16, 2022-07-17, 2022-07-18, 2022-07-22, 2022-07-25, 2022-07-26, 2022-07-27, 2022-07-28

Ce que je veux réaliser, c'est que j'obtienne l'intervalle des dates « concaténées », puis que j'obtienne « individuellement » la date « unique » comme ceci :

0 => 2022-07-15 - 2022-07-18
1 => 2022-07-22
2 => 2022-07-25 - 2022-07-28

Est-il possible de calculer à partir d'une chaîne vers la sortie avec quelques explosions et une boucle sur les dates d'une manière ou d'une autre ?

P粉946336138P粉946336138232 Il y a quelques jours407

répondre à tous(1)je répondrai

  • P粉057869348

    P粉0578693482024-02-05 00:58:06

    Oui, vous pouvez :

    • Divisez la chaîne en parties de chaîne de date
    • Triez cette liste. Étant donné que le format est AAAA-MM-JJ, l'ordre lexical par défaut convient.
    • Parcourez la liste et les entrées groupées dans des sous-tableaux lorsqu'elles représentent des dates consécutives. Utilisez strtotime($date . ' + 1 day') pour calculer la date suivante et vérifiez que la date suivante dans le tableau trié lui correspond. Si elle correspond à la date attendue, faites-en la deuxième entrée du sous-tableau actuel. S'il n'y a pas de correspondance, démarrez un nouveau sous-tableau,... et ainsi de suite
    • Enfin, convertissez ces sous-tableaux au format de chaîne dont vous avez besoin.
    function groupDates($input) {
        $arr = explode(", ", $input);
        sort($arr);
        $expected = -1;
        foreach ($arr as $date) {
            if (strtotime($date) == $expected) {
                array_splice($range, 1, 1, $date);
            } else {
                unset($range);
                $range = [$date];
                $ranges[] = &$range;
            }
            $expected = strtotime($date . ' + 1 day');
        }
        foreach ($ranges as $entry) {
            $result[] = implode(" - ", $entry);
        }
        return $result;
    }
    
    // Demo run
    $str = "2022-07-15, 2022-07-16, 2022-07-17, 2022-07-18, 2022-07-22, 2022-07-25, 2022-07-26, 2022-07-27, 2022-07-28";
    $result = groupDates($str);
    print_r($result);

    répondre
    0
  • Annulerrépondre