v2.5.2
Giriş yap

PHP Tarih Filtreleme

gorkem59
358 defa görüntülendi ve 1 kişi tarafından değerlendirildi

Forbidden dizisinde belirlediğim tarihlerin dışındaki tarihleri yazsın istiyorum. Ancak yan yana 4 kere tekrarlıyor bu durumu. Sadece 4. sütun doğru çalışıyor. İlk 3 sütunu yazmasını nasıl engelleyebilirim? Bilgisi olan yardımcı olabilir mi?
https://www.hizliresim.com/oya4twy
https://www.hizliresim.com/lzrjhuh

Cevap yaz
Cevaplar (1)
ebykdrms
693 gün önce
$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
for($i=0; $i<30; $i++) {
    $thisDate = date('Y-m-d', strtotime("$now + $i days"));
    if(in_array($thisDate, $forbidden)) continue;
    $allDatesExceptForbiddens[] = $thisDate;
}

Bu şekilde bugünden itibaren 30 günü (?) $allDatesExceptForbiddens dizisine aktarmış olursunuz.
Ama tabi 30 günden mesela 4 forbidden tarih denk gelmişse 30 değil 26 günü elde etmiş olursunuz.
Peki tam 30 gün elde etmek için ne yapabiliriz?

$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
$targetDateCount = 30;
for($i=0; $i<$targetDateCount; $i++) {
    $thisDate = date('Y-m-d', strtotime("$now + $i days"));
    if(in_array($thisDate, $forbidden)) { $targetDateCount++; continue; }
    $allDatesExceptForbiddens[] = $thisDate;
}

Hedef tarih sayısı olarak 30 dedik. Eğer for döngüsü istenmeyen bir tarihe denk geldiyse hedef tarih sayısını 1 artırarak döngünün fazladan 1 kere daha dönmesini sağladık. Böylece tam olarak 30 gün elde edene kadar dönmeye devam edecek.

Peki mesela tam 30 gün değil de bulunduğumuz ayın son gününe kadar olan bütün tarihleri elde etmek isteseydik?

$forbidden = ['2022-06-11', '2022-06-12', '2022-06-18', '2022-06-19', '2022-06-25', '2022-06-26'];
$allDatesExceptForbidens = [];
$now = date('Y-m-d');
$targetDateCount = (int)date('t',strtotime($now));
$dayOfToday = (int)date('d', strtotime($now));
$targetDateCount -= $dayOfToday;
for($i=0; $i<=$targetDateCount; $i++) {
    $thisDate = date('Y-m-d', strtotime("$now + $i days"));
    if(in_array($thisDate, $forbidden))  continue;
    $allDatesExceptForbiddens[] = $thisDate;
}

Bu sefer de ayın son gününden bugünü çıkarıp döngünün bu sayıda dönmesini sağladık. Ayın son gününe kaç gün varsa, forbidden date'ler hariç, hepsini elde ettik.

Sonuç olarak elde ettiğimiz tarihleri echo ile yazdırmak istiyorsak:

// html içine alt alta yazmak için:
echo implode('<br>', $allDatesExceptForbiddens);
// textarea gibi bir yere yazmak için: 
// echo implode('\n', $allDatesExceptForbiddens);

Not: Kodları onlinephp.io sitesinde test ettim.