如果在另一个二维数组中找不到该行,则过滤掉二维数组的行

问题描述 投票:0回答:2

我写了这段代码:

$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
。这是一个奇怪的异常现象吗?

php arrays multidimensional-array filtering array-intersect
2个回答
2
投票

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

0
投票

要通过比较全行数据来按第二个数组过滤第一个数组,请使用

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]
之外的所有行。 演示

© www.soinside.com 2019 - 2024. All rights reserved.