Rumah  >  Soal Jawab  >  teks badan

Gabungkan tarikh berturut-turut dalam rentetan tarikh

Saya mempunyai rentetan dengan tarikh yang dipisahkan dengan koma dan saya ingin mengira jika mana-mana tarikh tunggal disambungkan.

Jadi senarainya mungkin:

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

Apa yang saya ingin capai ialah saya mendapat selang tarikh "bercantum" dan kemudian "secara individu" mendapat tarikh "single" seperti ini:

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

Adakah mungkin untuk mengira dari rentetan ke output dengan beberapa letupan dan menggelungkan tarikh entah bagaimana?

P粉946336138P粉946336138232 hari yang lalu405

membalas semua(1)saya akan balas

  • P粉057869348

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

    Ya, anda boleh:

    • Belah tali kepada bahagian tali kurma
    • Isih senarai ini. Memandangkan formatnya ialah YYYY-MM-DD, susunan leksikal lalai adalah baik.
    • Lelaran atas senarai dan entri dikumpulkan dalam sub-baris apabila ia mewakili tarikh berturut-turut. Gunakan strtotime($date . ' + 1 day') untuk mengira tarikh seterusnya dan sahkan bahawa tarikh seterusnya dalam tatasusunan yang diisih sepadan dengannya. Jika ia sepadan dengan tarikh yang dijangkakan, jadikan ia masukan kedua dalam subarray semasa. Jika tiada padanan, mulakan sub-array baharu,...dan seterusnya
    • Akhirnya tukar sub-tatasusunan ini ke dalam format rentetan yang anda perlukan.
    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);

    balas
    0
  • Batalbalas