我写了这段代码:
$aArray = [
[0, 0, 0],
[1, 0, 0],
[2, 0, 0],
[3, 0, 0],
[4, 0, 0],
[5, 0, 0],
[6, 0, 0],
[7, 0, 0],
];
$jump = [
[0, 0, 0],
[1, 0, 0],
[9, 7, 4],
[3, 0, 0],
[4, 0, 0],
[5, 0, 0],
[6, 0, 0],
[7, 0, 0],
];
var_dump(array_intersect($aArray, $jump));
我得到的结果是这样的:
array(8) {
[0]=> array(3) {
[0]=> int(0)
[1]=> int(0)
[2]=> int(0) }
[1]=> array(3) {
[0]=> int(1)
[1]=> int(0)
[2]=> int(0) }
[2]=> array(3) {
[0]=> int(2)
[1]=> int(0)
[2]=> int(0) }
[3]=> array(3) {
[0]=> int(3)
[1]=> int(0)
[2]=> int(0) }
[4]=> array(3) {
[0]=> int(4)
[1]=> int(0)
[2]=> int(0) }
[5]=> array(3) {
[0]=> int(5)
[1]=> int(0)
[2]=> int(0) }
[6]=> array(3) {
[0]=> int(6)
[1]=> int(0)
[2]=> int(0) }
[7]=> array(3) {
[0]=> int(7)
[1]=> int(0)
[2]=> int(0) }
}
为什么第二个索引没有被过滤掉?我尝试清空缓存,以防其中存储有旧值。我还注意到,如果我从跳转数组中删除最后一个数组,它仍然会产生
7,0,0
。这是一个奇怪的异常现象吗?
array_intersect()
不是递归的,它将内部数组视为只是一个数组。 你需要使用这样的东西:
function array_intersect_recursive() {
foreach(func_get_args() as $arg) {
$args[] = array_map('serialize', $arg);
}
$result = call_user_func_array('array_intersect', $args);
return array_map('unserialize', $result);
}
$result = array_intersect_recursive($aArray, $jump);
要通过比较全行数据来按第二个数组过滤第一个数组,请使用
array_uintersect()
能够访问第二级数组。
代码:(演示)
var_export(array_uintersect_assoc($aArray, $jump, fn($a, $b) => $a <=> $b));
如果您想通过第一级键对行进行逐行比较,请使用
array_uintersect_assoc()
。
代码:(演示)
var_export(array_uintersect_assoc($aArray, $jump, fn($a, $b) => $a <=> $b));
由于除
[2]
之外的所有行都具有相同的第一级密钥和行负载,因此上面的两个片段都返回完全相同的结果。
如果将
$jump
的最后一行移动为第一行,则 array_unintersect_assoc()
将不返回任何行,但 array_uintersect()
仍将返回除 [2]
之外的所有行。 演示