PHP Tarih Filtreleme
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
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (1)
$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.