PHP问题:如何递归地使用array_intersect_assoc()

gar*_*c40 7 php arrays multidimensional-array

假设我想这样做:

$a = array_intersect_assoc(
 array(
  'key1' => array(
   'key2' => 'value2'
  ),
  'key3' => 'value3',
  'key4' => 'value4'
 ),

 array(
  'key1' => array(
   'key2' => 'some value not in the first parameter'
  ),
  'key3' => 'another value'
 )
);

var_dump( $a );

打印结果是:

array
  'key1' => 
    array
      'key2' => string 'value2' (length=6)

很明显,两个数组中与'key2'关联的值不相同,但array_intersect_assoc()仍然'key2' => 'value2'作为相交值返回.

这是预期的行为array_intersect_assoc()吗?

谢谢!

Bol*_*ock 8

是的,这是预期的行为,因为比较是使用字符串表示完成的,并且该函数不会递归嵌套数组.从手册:

只有当(字符串)$ elem1 ===(字符串)$ elem2时,来自key => value对的两个值才被认为是相等的.换句话说,执行严格类型检查,因此字符串表示必须相同.

如果您尝试与数组相交'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;
}
Run Code Online (Sandbox Code Playgroud)

  • `$ret[$key] =& array_intersect_assoc_recursive...` 会导致警告“仅应通过引用分配变量...”。可以用什么来代替 & 符号? (2认同)