PHP-вопрос: как рекурсивно решается массив array_intersect_assoc ()

Предположим, я хочу сделать это:

 $ a = array_intersect_assoc (
  массив (
   'key1' => массив (
    'key2' => 'value2'
   ),
   'key3' => 'value3',
   'key4' => 'value4'
  ),

  массив (
   'key1' => массив (
    'key2' => 'некоторое значение не в первом параметре'
   ),
   'key3' => 'другое значение'
  )
 );

 var_dump ($ a);

Печатный результат:

 массив
   'key1' => 
     массив
       'key2' => string 'value2' (length = 6)

Понятно, что значения, связанные с «ключ2» в обоих массивах, не совпадают, однако array_intersect_assoc() все равно возвращает 'key2' => 'value2' в качестве пересекаемого значения.

Является ли это ожидаемым поведением array_intersect_assoc() ?

Благодаря!

Да, это ожидаемое поведение, потому что сравнение выполняется с использованием строковых представлений, а функция не регрессирует вложенные массивы. Из руководства :

Два значения из пар ключ => считаются равными только если (строка) $ elem1 === (string) $ elem2 . Другими словами, выполняется строгая проверка типа, поэтому представление строки должно быть одинаковым.

Если вы попытаетесь пересечь массив с помощью 'key1' => 'Array' , вы получите тот же результат, потому что строковое представление массива всегда 'Array' .

Один из примечаний , внесенных пользователем , с помощью nleippe, содержит рекурсивную реализацию, которая выглядит многообещающей (я изменил третью строку, чтобы выполнить сравнение строк для любых значений без массива):

 function array_intersect_assoc_recursive(&$arr1, &$arr2) { if (!is_array($arr1) || !is_array($arr2)) { // return $arr1 == $arr2; // Original line return (string) $arr1 == (string) $arr2; } $commonkeys = array_intersect(array_keys($arr1), array_keys($arr2)); $ret = array(); foreach ($commonkeys as $key) { $ret[$key] =& array_intersect_assoc_recursive($arr1[$key], $arr2[$key]); } return $ret; }