【问题标题】:Find out which items were added and removed in an array找出在数组中添加和删除了哪些项目
【发布时间】:2014-08-05 16:12:46
【问题描述】:

我正在构建应用程序,当我用 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)。正确。

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

【问题讨论】:

  • 值 1 在两个数组中,这是问题...

标签: php arrays comparison


【解决方案1】:
 $added = array_diff($new,$old);

在上述语句中,array_diff()$new$old 进行比较,并返回$new存在于$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

【讨论】:

  • @Downvoter:您的解释可以帮助我改进这个答案。
  • 您不需要编写自己的函数。 PHP 有一个内置函数可以检查数组的键。
  • @VMai:OP 没有说明数组键。 $old = array(2, 1); $new = array(1,2); 应该产生一个空数组,但 print_r(array_diff_assoc($new,$old)); 给出 [1, 2]。请注意,OP 没有说明数组键。
  • +1 并接受 即使在我相当复杂的应用程序中使用函数时,我也发现了一点问题。幸运的是,它很容易修复:if($pos !== false){unset($array1[$pos]);}
  • @petjato:哦,对了。我忘记了。我已经更新了答案以反映这一点。谢谢!
【解决方案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";

?>

【讨论】:

  • @downvoter:请解释我的回答有什么问题。我认为这是一个明确的答案,可以解释与 OP 代码的区别。
  • 这在计算差值时也考虑了数组中元素的位置。例如,重新排列的 OP 数组:$old = array(1,5,10); $new = array(5,1,1); 将产生 [5,1,1]。这是不正确的。
猜你喜欢
  • 2014-12-23
  • 2017-01-29
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多