У меня есть два массива, для которых var_dump дает следующие значения:
$ Array1:
Artifacts:array(2) { [0]=> array(3) { [0]=> string(7) "module1" [1]=> string(16) "path/to/file.txt" [2]=> string(0) "" } [1]=> array(3) { [0]=> string(7) "module2" [1]=> string(17) "path/to/file2.txt" [2]=> string(0) "" } }
$ Array2:
Artifacts:array(1) { [0]=> array(3) { [0]=> string(7) "module1" [1]=> string(16) "path/to/file.txt" [2]=> string(0) "" } }
Я бы подумал, что выполнение array_diff($array1,$array2)
даст мне массив, содержащий только два элемента. Вместо этого я получил пустой массив. Я пытаюсь переключать параметры, и все равно пустые_арифы, но на этот раз без удивления. Не будет ли array_diff
работать с массивами массивов?
Из документации :
Два элемента считаются равными тогда и только тогда, когда
(string) $elem1 === (string) $elem2
. В словах: когда строковое представление одно и то же.
echo (string) array();
дает вам просто Array
, поэтому для array_diff
ваши массивы выглядят так:
$array1 = array('Array', 'Array'); $array2 = array('Array');
Поэтому для создания diff для ваших массивов вам понадобится нечто подобное (если предположить, что каждый элемент массива сам по себе является массивом):
$diff = array(); foreach($array1 as $val1) { $contained = false; foreach($array2 as $val2) { if(count(array_diff($val1, $val2)) == 0) { $contained = true; break; } } if(!$contained) { $diff[] = $val1; } }
Отказ от ответственности: это более или менее просто эскиз.
Из документации array_diff .
Эта функция проверяет только одно измерение n-мерного массива. Конечно, вы можете проверить более глубокие размеры, используя array_diff ($ array1 [0], $ array2 [0]);
Из справочной страницы array_diff : «Эта функция проверяет только одно измерение n-мерного массива. Конечно, вы можете проверить более глубокие измерения с помощью array_diff ($ array1 [0], $ array2 [0]) ;."
На вопрос и ответили здесь:
рекурсивный array_diff ()?