44

我有一个包含相关数据行的数组。

$array1 = array(
    array('ITEM' => 1),
    array('ITEM' => 2),
    array('ITEM' => 3),
);

我有第二个数组,也包含关联数据的行,我想使用第一个数组进行过滤。

$array2 = array(
    array('ITEM' => 2),
    array('ITEM' => 3),
    array('ITEM' => 1),
    array('ITEM' => 4),
);

这感觉像是一份工作array_diff(),但我如何才能专门比较更深层次的ITEM值的行呢?

如何过滤第二个数组并获得以下结果?

array(3 => array('ITEM' => 4))
4

9 回答 9

66

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

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

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

输出:

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

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

于 2012-08-06T03:39:30.540 回答
20

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

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

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

$new_array = array_diff($aTmp1,$aTmp2);
于 2012-08-06T02:10:58.067 回答
19

另一种有趣的方法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);
于 2017-03-01T11:32:10.990 回答
8

使用它的几个解决方案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;
});

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

于 2015-11-06T00:02:20.760 回答
3

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

$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'));
于 2018-03-01T10:14:19.583 回答
1

有同样的问题,但我的多维数组在每个数组中始终具有与您的“ITEM”不同的各种键。

解决了它:$result = array_diff_assoc($array2, $array1);

参考:PHP:array_diff_assoc

于 2018-07-31T01:56:30.493 回答
0

另一种解决方案 if( json_encode($array1) == json_encode($array2) ){ ... }

于 2021-07-28T20:25:31.917 回答
0

相信 PHP 的维护者已经进行了优化array_udiff(),以超越所有其他可以做到这一点的技术。

对于您的方案,您正在寻求一种过滤array_diff()来评估第一级“值”(数据行)内的数据。在自定义函数中,必须隔离特定列以进行比较。有关所有本机array_diff()函数变体的列表,请参阅此答案

要使用第一个数组过滤第二个数组(并从第二个数组输出保留的数据),您必须写$array2为第一个参数和$array1第二个参数。

array_diff()array_intersect()利用(包含u在它们的函数名称中)的函数期望一个整数作为它们的返回值。 该值用于在实际执行评估之前对数据进行初步排序——这是一种性能优化。在某些情况下,如果您只返回01(不是三向比较),那么结果可能会出乎意料。为确保结果稳定,请始终提供可以返回负数、正数和零整数的比较函数。

比较整数值时,减法 ( $a - $b) 将给出可靠的返回值。为了在比较浮点值或非数字数据时获得更大的实用性,您可以在您的 PHP 版本可用时使用 spaceship 运算符。

代码:(演示

  • PHP7.4+(箭头函数)

    var_export(
        array_udiff($array2, $array1, fn($a, $b) => $a['ITEM'] <=> $b['ITEM'])
    );
    
  • PHP7+(宇宙飞船操作员)

    var_export(
        array_udiff(
            $array2,
            $array1,
            function($a, $b) {
                return $a['ITEM'] <=> $b['ITEM'];
            }
        )
    );
    
  • PHP5.3+(匿名函数)

    var_export(
        array_udiff(
            $array2,
            $array1,
            function($a, $b) {
                return $a['ITEM'] === $b['ITEM']
                    ? 0
                    : ($a['ITEM'] > $b['ITEM'] ? 1 : -1);
            }
        )
    );
    

以上所有版本的输出:

array (
  3 => 
  array (
    'ITEM' => 4,
  ),
)

使用对象数组时,技术是相同的;只有访问属性的语法不同于访问数组元素($a['ITEM']将是$a->ITEM)。


对于与一个数组隔离的元素在另一个数组中不存在的情况,您需要将两者$a$b数据合并到相反的备用列,因为来自第一个数组和第二个数组的数据将在打回来。

代码:(演示

$array1 = array(
    array('ITEM' => 1),
    array('ITEM' => 2),
    array('ITEM' => 3),
);

$array2 = array(
    array('ITEMID' => 2),
    array('ITEMID' => 3),
    array('ITEMID' => 1),
    array('ITEMID' => 4),
);

// PHP7.4+ (arrow functions)
var_export(
    array_udiff(
        $array2,
        $array1,
        fn($a, $b) => ($a['ITEM'] ?? $a['ITEMID']) <=> ($b['ITEM'] ?? $b['ITEMID'])
    )
);
于 2022-02-09T12:11:26.330 回答
-2

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

        //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);
于 2019-05-21T17:27:19.127 回答