假设我想这样做:
$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)
很明显,两个数组中与“key 2”关联的值是不同的,但是array_intersect_assoc()
仍然返回'key2' => 'value2'
作为相交的值。
这是array_intersect_assoc()
的预期行为吗?
谢谢你!
4条答案
按热度按时间b09cbbtk1#
是的,这是预期的行为,因为比较是使用字符串表示来完成的,并且函数不会向下递归嵌套数组。
只有当 (string)$elem1 ===(string)$elem2 时,key =〉value 对中的两个值才被认为是相等的。换句话说,执行严格的类型检查,因此字符串表示必须相同。
如果你试图用
'key1' => 'Array'
与数组求交集,你会得到同样的结果,因为数组的字符串表示总是'Array'
。nleippe在用户提供的注解中包含了一个看起来很有前途的递归实现(我修改了第三行,以便对任何非数组值进行字符串比较):
quhf5bfb2#
e4eetjau3#
一个可以满足您需要的函数:
8ulbf1ek4#
我的版本基于@BoltClock版本:
我使用这段代码来过滤复杂数组中数据
例如:
在线测试:https://onlinephp.io/c/3be04