假设我要这样做:

$ a = array_intersect_assoc(
大批(
'key1'=>数组(
'key2'=>'value2'
),
'key3'=>'value3',
'key4'=>'value4'
),

大批(
'key1'=>数组(
'key2'=>'某些值不在第一个参数中'
),
'key3'=>'另一个值'
)
);

var_dump($ a);

打印结果为:

大批
'key1'=>
大批
'key2'=>字符串'value2'(长度= 6)

显然,两个数组中与“key2”关联的值都不相同,但是array_intersect_assoc()仍返回'key2' => 'value2'作为相交值。

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

谢谢!

最佳答案

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



如果您尝试与带有'key1' => 'Array'的数组相交,则会得到相同的结果,因为数组的字符串表示形式始终为'Array'

nleippe编写的One of the user-contributed notes包含一个看起来很有希望的递归实现(我修改了第三行以对任何非数组值进行字符串比较):

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;
}

关于PHP问题: how to array_intersect_assoc() recursively,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4627076/

10-10 14:11