Почему array_diff на массивах массивов возвращает пустой массив?

У меня есть два массива, для которых 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 ()?