假设我要这样做:
$ 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/