Используя array_diff()
, я могу сравнивать и удалять похожие элементы, но что, если у меня есть следующие массивы?
Array1
Array ( [0] => Array ( [ITEM] => 1 ) [1] => Array ( [ITEM] => 2 ) [2] => Array ( [ITEM] => 3 ) )
array2
Array ( [0] => Array ( [ITEM] => 2 ) [1] => Array ( [ITEM] => 3 ) [2] => Array ( [ITEM] => 1 ) [3] => Array ( [ITEM] => 4 ) )
Я хочу отфильтровать похожие элементы; результат должен вернуться 4. Как я могу изменить порядок массива, чтобы я мог использовать array_diff()
?
Я бы, вероятно, перебирал исходные массивы и делал их одномерными … что-то вроде
foreach($array1 as $aV){ $aTmp1[] = $aV['ITEM']; } foreach($array2 as $aV){ $aTmp2[] = $aV['ITEM']; } $new_array = array_diff($aTmp1,$aTmp2);
Вы можете определить пользовательскую функцию сравнения с помощью array_udiff()
.
function udiffCompare($a, $b) { return $a['ITEM'] - $b['ITEM']; } $arrdiff = array_udiff($arr2, $arr1, 'udiffCompare'); print_r($arrdiff);
Вывод:
Array ( [3] => Array ( [ITEM] => 4 ) )
Это использует и сохраняет существующую структуру массивов, которую я предполагаю, что вы хотите.
Несколько решений с использованием array_filter
, которые менее эффективны, чем решение array_udiff
для больших массивов, но которые немного более просты и гибки:
$array1 = [ ['ITEM' => 1], ['ITEM' => 2], ['ITEM' => 3], ]; $array2 = [ ['ITEM' => 2], ['ITEM' => 3], ['ITEM' => 1], ['ITEM' => 4], ]; $arrayDiff = array_filter($array2, function ($element) use ($array1) { return !in_array($element, $array1); }); // OR $arrayDiff = array_filter($array2, function ($array2Element) use ($array1) { foreach ($array1 as $array1Element) { if ($array1Element['ITEM'] == $array2Element['ITEM']) { return false; } } return true; });
array_filter
внимание на то, что array_filter
сохраняет ключи исходного массива, поэтому, если вы хотите, чтобы $arrayDiff
был нулевым индексированием, выполните $arrayDiff = array_values($arrayDiff);
после вызова array_filter
.
Еще один забавный подход с трюком json_encode
(может быть полезным, если вам нужно «сырое» сравнить некоторые сложные значения в массиве первого уровня):
// Compare all values by a json_encode $diff = array_diff(array_map('json_encode', $array1), array_map('json_encode', $array2)); // Json decode the result $diff = array_map('json_decode', $diff);