Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой на некоторое время, и просто не может решить ответ.
У меня есть два массива, и эти массивы содержат информацию об 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)));