关于具有多维数组的php:array_diff()

array_diff() with multidimensional arrays

使用array_diff(),我可以比较和删除相似的项目,但是如果我有以下数组怎么办?

阵列1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
    [0] => Array
        (
            [ITEM] => 1
        )

    [1] => Array
        (
            [ITEM] => 2
        )

    [2] => Array
        (
            [ITEM] => 3
        )
)

数组2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Array
(
    [0] => Array
        (
            [ITEM] => 2
        )

    [1] => Array
        (
            [ITEM] => 3
        )

    [2] => Array
        (
            [ITEM] => 1
        )
    [3] => Array
        (
            [ITEM] => 4
        )
)

我想过滤掉类似的物品; 结果应该返回4。如何重新排列数组,以便可以使用array_diff()


您可以使用array_udiff()定义自定义比较功能。

1
2
3
4
5
6
7
function udiffCompare($a, $b)
{
    return $a['ITEM'] - $b['ITEM'];
}

$arrdiff = array_udiff($arr2, $arr1, 'udiffCompare');
print_r($arrdiff);

输出:

1
2
3
4
5
6
7
Array
(
    [3] => Array
        (
            [ITEM] => 4
        )
)

这使用并保留了数组的现有结构,我认为这是您想要的。


我可能会遍历原始数组并使它们成为一维的...类似

1
2
3
4
5
6
7
8
9
foreach($array1 as $aV){
    $aTmp1[] = $aV['ITEM'];
}

foreach($array2 as $aV){
    $aTmp2[] = $aV['ITEM'];
}

$new_array = array_diff($aTmp1,$aTmp2);

json_encode技巧的另一种有趣的方法(如果您需要"原始"比较第一级数组中的一些复杂值,可能会很有用):

1
2
3
4
5
// Compare all values by a json_encode
$diff = array_diff(array_map('json_encode', $array1), array_map('json_encode', $array2));

// Json decode the result
$diff = array_map('json_decode', $diff);


对于大型数组,使用array_filter的几种解决方案性能不如array_udiff解决方案,但是它们更直接,更灵活:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$array1 = [
    ['ITEM' => 1],
    ['ITEM' => 2],
    ['ITEM' => 3],
];

$array2 = [
    ['ITEM' => 2],
    ['ITEM' => 3],
    ['ITEM' => 1],
    ['ITEM' => 4],
];

$arrayDiff = array_filter($array2, function ($element) use ($array1) {
    return !in_array($element, $array1);
});

// OR

$arrayDiff = array_filter($array2, function ($array2Element) use ($array1) {
    foreach ($array1 as $array1Element) {
        if ($array1Element['ITEM'] == $array2Element['ITEM']) {
            return false;
        }
    }
    return true;
});

array_filter一样,请注意array_filter保留原始数组的键,因此如果希望$arrayDiff为零索引,请在array_filter调用后执行$arrayDiff = array_values($arrayDiff);


您可以使用以下代码获得差异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$a1 = Array(
    [0] => Array(
            [ITEM] => 1
        )
    [1] => Array(
            [ITEM] => 2
        )
    [2] => Array(
            [ITEM] => 3
        )
    );

$a2 = Array(
    [0] => Array(
            [ITEM] => 2
        )
    [1] => Array(
            [ITEM] => 3
        )

    [2] => Array(
            [ITEM] => 1
        )
    [3] => Array(
            [ITEM] => 4
        ));

array_diff(array_column($a1, 'ITEM'), array_column($a2, 'ITEM'));


有同样的问题,但是我的多维数组在每个数组中都有与您的" ITEM"不同的各种键。

解决方法:$result = array_diff_assoc($array2, $array1);

参考:PHP:array_diff_assoc


将array1与一个或多个其他数组进行比较,并返回array1中其他任何数组中不存在的值。

1
2
3
4
5
6
7
        //Enter your code here, enjoy!

$array1 = array("a" =>"green","red","blue");
$array2 = array("b" =>"green","yellow","red");
$result = array_diff($array1, $array2);

print_r($result);