找出在数组中添加和删除的项目

时间:2014-06-15 19:47:54

标签: php arrays comparison

当我用 X 增加总和时,我正在构建告诉用户以及银行备注的应用程序。一切都很好,但我想知道我现在如何获得添加和删除数组的列表?

$old = array(1,5,10);
$new = array(1,5,1);

$added = array_diff($new,$old);
$removed = array_diff($old,$new);

这就是上面的代码返回的内容:

  • $addedarray()。不正确,应为array([2] => 1)
  • $removedarray([2] => 10)。正确的。

我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:3)

 $added = array_diff($new,$old);

在上述声明中,array_diff()$new$old进行了比较,并返回$new中{em>不中$old中的值}}。没有这样的值,因此它返回一个空数组。

简而言之,array_diff()不能处理重复值。您必须编写自定义函数才能实现此目的。这是an example

function array_diff_once($array1, $array2) {
    foreach($array2 as $val) {
        if (false !== ($pos = array_search($val, $array1))) {
            unset($array1[$pos]);
        }    
    }
    return $array1;
}

您可以像以前一样使用它:

$added   = array_diff_once($new,$old);
$removed = array_diff_once($old,$new);
这些数组的

print_r()将正确输出:

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

Working demo

答案 1 :(得分:-2)

如果要检查除数组值之外的键,则应使用array_diff_assoc()而不是array_diff()

<?php
    $old = array(1,5,10);
    $new = array(1,5,1);

    $added = array_diff_assoc($new,$old);
    $removed = array_diff_assoc($old,$new);

    echo "<pre>\n";     \\ prints array(1) {  [2]=>  int(1) }
    var_dump($added);
    var_dump($removed);
    echo "</pre>\n";

&GT;