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()吗?
谢谢!
是的,这是预期的行为,因为比较是使用字符串表示完成的,并且该函数不会递归嵌套数组.从手册:
只有当(字符串)$ 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)