具有多维数组的array_diff()

Jon*_*han 34 php arrays

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

数组1

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

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

    [2] => Array
        (
            [ITEM] => 3
        )
)
Run Code Online (Sandbox Code Playgroud)

ARRAY2

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

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

    [2] => Array
        (
            [ITEM] => 1
        )
    [3] => Array
        (
            [ITEM] => 4
        )
)
Run Code Online (Sandbox Code Playgroud)

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

Wis*_*guy 55

您可以使用定义自定义比较函数array_udiff().

function udiffCompare($a, $b)
{
    return $a['ITEM'] - $b['ITEM'];
}

$arrdiff = array_udiff($arr2, $arr1, 'udiffCompare');
print_r($arrdiff);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [3] => Array
        (
            [ITEM] => 4
        )
)
Run Code Online (Sandbox Code Playgroud)

这使用并保留了数组的现有结构,我假设你需要它.

  • 在PHP7及以后,你可以使用[飞船运营商(https://wiki.php.net/rfc/combined-comparison-operator):`$返回一个[ '项'] <=> $ B ['ITEM "];` (12认同)
  • 我知道这是一个有点老的话题,但是对于那些使用非整数而不是字符串的id的人来说,你可能想在udiffCompare函数中使用return strcmp($ a ['ITEM],$ b ['ITEM']) (7认同)

Jas*_*gar 16

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

foreach($array1 as $aV){
    $aTmp1[] = $aV['ITEM'];
}

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

$new_array = array_diff($aTmp1,$aTmp2);
Run Code Online (Sandbox Code Playgroud)


Ifn*_*not 13

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

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,只有这个有效.对称版本`public static function myArrayDiff($ array1,$ array2){return array_map('json_decode',array_merge(array_diff(array_map('json_encode',$ array1),array_map('json_encode',$ array2)),array_diff(array_map) ('json_encode',$ array2),array_map('json_encode',$ array1)))); }` (2认同)

Mar*_*ery 6

使用array_filter它的一些解决方案的性能不如大型阵列array_udiff解决方案,但更简单,更灵活:

$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;
});
Run Code Online (Sandbox Code Playgroud)

与往常一样array_filter,请注意array_filter保留原始数组的键,因此如果要$arrayDiff进行零索引,请$arrayDiff = array_values($arrayDiff);array_filter调用后执行.


小智 5

您可以使用下面的代码来获得差异。

array_diff(array_column($a1, 'ITEM'), array_column($a2, 'ITEM'));
Run Code Online (Sandbox Code Playgroud)