调用 array_diff() 时输入数组的顺序重要吗?

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

我正在尝试找出 2 个数组中的差异。

$inven_old = array(1,2,3,4); 
$inven_new = array(1,2,3,4,5); 
$result = array_diff($inven_old, $inven_new); 
print_r($result);

为什么结果什么都没有?

不应该是“5”吗?

如果没有,我该如何做我想做的事?

php arrays filter parameters array-difference
7个回答
6
投票

返回一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目。

http://php.net/manual/en/function.array-diff.php

array_diff()
给出从第一个数组减去除第一个数组之外的所有数组的结果。因此,第二个数组中但不在第一个数组中的内容将不会显示。 (换句话说,这不是对称差异。)


2
投票

http://www.php.net/manual/en/function.array-diff.php

返回一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目。

所以如果你这样做:

$result = array_diff($inven_new, $inven_old);

结果将包含“5”。

奖励:如果您需要无论数组顺序如何都可以工作的东西,请尝试:

$result = array_diff($a + $b, array_intersect($a, $b));

1
投票

回复很晚,但也许有时这会对某人有所帮助..

function array_deep_diff($d1, $d2) {
    if (is_array($d1) && is_array($d2))  {
        $diff = array();
        foreach (array_unique(array_merge(array_keys($d1), array_keys($d2))) as $key) {
            if (!array_key_exists($key, $d1)) {
                $diff['added'][$key] = $d2[$key];
            } else if (!array_key_exists($key, $d2)) {
                $diff['removed'][$key] = $d1[$key];
            } else {
                $tmp = array_deep_diff($d1[$key], $d2[$key]);
                if (!empty($tmp)) $diff[$key] = $tmp;
            }
        }
        return $diff;

    } else if (!is_array($d1) && !is_array($d2))  {
        if ($d1 == $d2) return array();
        $ret = "$d1 ---> $d2";
        // just a little touch for numerics, might not be needed
        if (is_numeric($d1) && is_numeric($d2)) {
            if ($d1 > $d2) $ret .= ' [- ' . ($d1 - $d2) . ']';
            if ($d1 < $d2) $ret .= ' [+ ' . ($d2 - $d1) . ']';
        }
        return $ret;

    } else {
        return array('Array compared with NonArray');
    }       
}

0
投票

要使其按预期工作,您需要颠倒参数:

$result = array_diff($inven_new, $inven_old); 

否则,您将检查 inven_new 中缺少哪些元素,并且显然没有丢失任何元素。


0
投票

第二个数组应该排在第一位

$inven_old = array(1,2,3,4); 
$inven_new = array(1,2,3,4,5); 
$result = array_diff($inven_new, $inven_old); 
print_r($result);

0
投票

没有内置函数,但您可以轻松编写自定义函数(http://ideone.com/UNRKV):

$old = array(5,5,4); 
$new = array(5,5,4,4); 

function array_subtract($a, $b)
{
    foreach ($b as $val) {
        $i = array_search($val, $a);
        if ($i !== false) {
            unset($a[$i]);
        }
    }

    return array_values($a);
}

$result = array_subtract($new, $old);

var_dump($result);

0
投票

这会从第一个数组 (

$old
) 开始消耗,直到所有数组都消失:

$result = array();
$old = array_count_values($old);
foreach($new as $value)
{
    @$old[$value] ? $old[$value]-- : $result[] = $value;
}

结果:

$old = array(5,5,4);
$new = array(5,5,4,4);

...

array(1) {
  [0]=>
  int(4)
}
© www.soinside.com 2019 - 2024. All rights reserved.