v2.5.2
Giriş yap

Dizideki Tarih Değerine Göre Gruplamak

baskabiri
408 defa görüntülendi ve 1 kişi tarafından değerlendirildi
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

ilyasbilgihan
1240 gün önce

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>";
}