Intereting Posts
PHP не отображает ошибки, хотя display_errors = On получить последние подкасты из магазина itunes со ссылкой на RSS, JSON или что-то Изменить URL-адрес запроса, чтобы указать на другой веб-сервер в сервлет-фильтре скачать файл csv Как отобразить вложенный Json-объект в Jqgrid Как использовать защищенный веб-сервис с WS-Security через SOAP ? случайная ошибка symfony: ContextErrorException: Warning: simplexml_load_file (): предупреждение ввода-вывода: не удалось загрузить внешний объект Как обрабатывать исключения PDO Как реализовать Paypal Recurring Payment API С возможностью оплаты покупателями по кредитным / дебетовым картам php? Ошибка Paypal PDT 4003 Ошибка PHP unserialize с некодированными символами? WooCommerce – получить категорию для страницы продукта Преобразовать точечный синтаксис как «this.that.other» в многомерный массив в PHP Переписать URL с двумя или более параметрами PHP – запрашивать одно значение для каждой итерации или извлекать все при запуске и извлекать из массива?

array_diff () с многомерными массивами

Используя 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);