Dizideki Tarih Değerine Göre Gruplamak
Array
(
[0] => stdClass Object
(
[count] => 25
[date] => 20200629
[paymentType] => cod
)
[1] => stdClass Object
(
[count] => 64
[date] => 20200629
[paymentType] => credit card
)
[2] => stdClass Object
(
[count] => 33
[date] => 20200630
[paymentType] => cod
)
[3] => stdClass Object
(
[count] => 110
[date] => 20200630
[paymentType] => credit card
)
)
Selamlar, yukarıdaki gibi bir dizide tarih değeri aynı olanları gruplayarak şuna benzer bir görüntü ile ekrana yazdırmak istiyorum ve hiçbir fikrim yok nasıl yapabileceğime dair;
20200629
cod : 25
credit card : 64
20200630
cod : 33
credit card : 110
Yapılmasının bir çok yolunun olması bir yana, array_reduce
metodu ile nasıl yapılır? Bildiğim kadarıyla açıklamaya çalışayım.
array_reduce
metodu üç parametre alıyor;
- İlk parametre, işlem yapmak üzere gezinmek istediğimiz array.
- İkinci parametre, yapacağımız işlemleri gerçekleştirecek bir callback fonksiyon. (bunun da iki parametresi var)
- İlki, PHP'nin kendi sitesinde $carry olarak adlandırdığı, genelde "accumulator" olarak da bilinen, her bir iterasyonda modifiye edilen/güncellenen, yapılan işlemler sonucu döndürülecek olan değişken.
- İkincisi ise PHP'nin kendi sitesinde $item olarak adlandırdığı, gezinmek üzere verdiğimiz array deki her bir değeri sırayla döngü boyunca tutacak olan değişken.
- Üçüncü parametre ise isteğe bağlı olan, callback fonksiyonumuza verdiğimiz "accumulator"ın başlangıç değeri.
Aşağıdaki kodun kabaca ne yaptığını anlatayım, array_reduce
metodu ile $data
mız içerisinde dönüyoruz. Her döngüde $acc
içerisinde $date
isimli bir keyin(değişkenin) olup olmadığını kontrol ediyoruz, yoksa bu isimde bir key
oluşturup value
olarak da boş bir array veriyoruz. Daha sonra array_push
metodu yardımıyla $obj
mizi az önce oluşturduğumuz ya da daha önce oluşturulmuş olan $acc->$date
arrayine pushluyoruz. Son olarak elimizdeki $acc
değerini döngünün sonraki iterasyonunda kullanılmak(modifiye etmek/güncellemek) üzere döndürüyoruz.
function categorizeData($acc, $obj)
{
$date = $obj->date;
if(!isset($acc->$date)){
$acc->$date = array();
}
array_push($acc->$date, $obj);
return $acc;
}
// $data = soruda belirtmiş olduğun array
$categorizedData = array_reduce($data, "categorizeData", (object) array());
print_r($categorizedData);
Sonuç:
stdClass Object
(
[20200629] => Array
(
[0] => stdClass Object
(
[count] => 25
[date] => 20200629
[paymentType] => cod
)
[1] => stdClass Object
(
[count] => 64
[date] => 20200629
[paymentType] => credit card
)
)
[20200630] => Array
(
[0] => stdClass Object
(
[count] => 33
[date] => 20200630
[paymentType] => cod
)
[1] => stdClass Object
(
[count] => 110
[date] => 20200630
[paymentType] => credit card
)
)
)
$categorizedData
değişkeni üzerinde foreach yardımıyla istediğin sonuca ulaşabilirsin.
foreach($categorizedData as $date => $data) {
echo "<b>$date</b><br>";
foreach($data as $val){
echo "$val->paymentType : $val->count<br>";
}
echo "<br>";
}