Используйте array_diff_assoc () или получите разницу в многомерных массивах

Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой на некоторое время, и просто не может решить ответ.

У меня есть два массива, и эти массивы содержат информацию об id, linklabel и url в следующем формате:

$pageids -------- Array ( [0] => Array ( [id] => 1 [linklabel] => Home [url] => home ) [1] => Array ( [id] => 2 [linklabel] => Graphic Design [url] => graphicdesign ) [2] => Array ( [id] => 3 [linklabel] => Other Design [url] => otherdesign ) [3] => Array ( [id] => 6 [linklabel] => Logo Design [url] => logodesign ) [4] => Array ( [id] => 15 [linklabel] => Content Writing [url] => contentwriting ) ) $parentpage ----------- Array ( [0] => Array ( [id] => 2 [linklabel] => Graphic Design [url] => graphicdesign ) [1] => Array ( [id] => 3 [linklabel] => Other Design [url] => otherdesign ) ) 

Теперь я пытаюсь сравнить эти два, чтобы найти информацию, которая находится в $pageids но НЕ в $parentpage – это тогда будет составлять другой массив, называемый $pageWithNoChildren . Однако, когда я использую следующий код:

 $pageWithNoChildren = array_diff_assoc($pageids,$parentpage); 

array_diff_assoc() работает на первом уровне массивов и поэтому видит, что и $pageids и $parentpages имеют $parentpages [0] и [1], поэтому он игнорирует их и возвращает всю информацию из $pageids из [2] и далее. Однако я хочу, чтобы он смотрел содержимое вложенных массивов и сравнивал их, например, мне нужно, чтобы определить, какой идентификатор, ссылка и url указаны в $pageids а не в $parentpages и возвращают эти значения.

Как я могу заставить array_diff_assoc() запускаться на клавишах вложенных массивов, а не на ключи первых массивов, поэтому конечным результатом является массив, содержащий содержимое массивов [0], [3] и [4] от $pageids ?

Чтобы проверить многопоточность, попробуйте что-то вроде этого:

 $pageWithNoChildren = array_map('unserialize', array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage))); 
  • array_map() запускает каждую array_map() основных массивов посредством serialize()
  • serialize() преобразует каждый вспомогательный массив в строковое представление этого подматрица
  • основные массивы теперь имеют значения, которые не являются массивами, но строковые представления подмассивов
  • array_diff() теперь имеет одномерный массив для каждого из массивов для сравнения
  • после того, как возвращается array_map() запускает результат массива (различия) через unserialize() чтобы преобразовать представления строк в подматрицы

QED

Очень приятное решение от @AbraCadaver, но, как я уже сказал в комментариях, могут быть случаи, когда элементы ассоциативных массивов не находятся в одном порядке везде, поэтому удобна специальная функция, которая сортирует их по индексу / ключу :

 function sortAndSerialize($arr){ ksort($arr); return serialize($arr); } array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));