v2.5.2
Giriş yap

PHP ile İki Dizi Arasındaki Farklı Value'ları Bulma

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

Merhaba PT.

Elimde 2 dizi var. Sıralamaları karışık fakat value'larında eşleştirebileceğim item_id'ler var. ID'leri aynı olup item_content'leri farklı olanları $sonuç dizimdeki şekliyle almak istiyorum. Bir türlü çıkamadım işin içinden. :)

$dizi1 = [
  0 => [  
    "item_id" => 4,
    "item_content" => "prototurk"
  ],
  1 => [
    "item_id" => 2,
    "item_content" => "prototurk"
  ],
  2 => [
    "item_id" => 3,
    "item_content" => "prototurk"
  ],
  3 => [
    "item_id" => 1,
    "item_content" => "prototurk"
  ]
];

$dizi2 = [
  0 => [
    "item_id" => 1,
    "item_content" => "soru"
  ],
  1 => [
    "item_id" => 2,
    "item_content" => "prototurk"
  ],
  2 => [
    "item_id" => 3,
    "item_content" => "cevap"
  ],
  3 => [
    "item_id" => 4,
    "item_content" => "prototurk"
  ]
];

$sonuc = [
  0 => [
    "item_id" => 1,
    "item_content" => [
      "old" => "prototurk",
      "new" => "soru"
    ]
  ],
  1 => [
    "item_id" => 3,
    "item_content" => [
      "old" => "prototurk",
      "new" => "cevap"
    ]
  ]
];
Cevap yaz
Cevaplar (3)
abdullahx
761 gün önce
uasort($dizi1, fn($a, $b) => $a['item_id'] - $b['item_id']);
uasort($dizi2, fn($a, $b) => $a['item_id'] - $b['item_id']);

$new = array_map(function ($item1, $item2) {
    if ($item1['item_content'] != $item2['item_content'])
        return [
            'item_id' => $item1['item_id'],
            'item_content' => [
                'old' => $item1['item_content'],
                'new' => $item2['item_content']
            ]
        ];
    return false;
}, $dizi1, $dizi2);

print_r(array_values(array_filter($new)));

veya


uasort($dizi1, fn($a, $b) => $a['item_id'] - $b['item_id']);
uasort($dizi2, fn($a, $b) => $a['item_id'] - $b['item_id']);
$dizi1 = array_values($dizi1);
$dizi2 = array_values($dizi2);

$sonuc = [];

foreach ($dizi1 as $i => $value) {
    if ($value['item_content'] != $dizi2[$i]['item_content'])
        $sonuc[] = [
            'item_id' => $value['item_id'],
            'item_content' => [
                'old' => $value['item_content'],
                'new' => $dizi2[$i]['item_content']
            ]
        ];
}

print_r($sonuc);
abdullahx
760 gün önce

Kısa yazmak için arrow function kullanmak istedim ve sizin de söylediğiniz gibi PHP 7.4 sürümünde eklenen bir özellik olduğu için eski sürümlerde hata verir.
https://www.php.net/manual/en/functions.arrow.php
Normal function şekliyle de kullanabilirsiniz.

uasort($dizi1, function($a, $b) {
    return $a['item_id'] - $b['item_id']
});

redline
760 gün önce

@abdullahx hocam,

uasort($dizi1, fn($a, $b) => $a['item_id'] - $b['item_id']);
uasort($dizi2, fn($a, $b) => $a['item_id'] - $b['item_id']);

kısmında hata alıyorum ama bu fonksiyonu daha önce de görmediğim için nasıl kullanıldığını bilmiyorum o yüzden anlayamadım da hatanın nerede olduğunu. :)

- D Ü Z E N L E M E -

PHP sürümü 7.2'deydi, 7.4'e yükselttim hata gitti.

@abdullahx hocam çok teşekkür ediyorum diziler konusunda çok yardımın dokunuyor. :)