Php 找出在数组中添加和删除了哪些项

Php 找出在数组中添加和删除了哪些项,php,arrays,comparison,Php,Arrays,Comparison,我正在构建一个应用程序,当我用X增加总和时,它会告诉用户哪些是旧的,哪些是新的钞票。一切都很好,但我想知道现在如何才能获得数组中添加和删除项的列表? $old = array(1,5,10); $new = array(1,5,1); $added = array_diff($new,$old); $removed = array_diff($old,$new); 这就是上面代码返回的结果: $added是array()。不正确,它应该是数组([2]=>1) $removed是数组([2]

我正在构建一个应用程序,当我用X增加总和时,它会告诉用户哪些是旧的,哪些是新的钞票。一切都很好,但我想知道现在如何才能获得数组中添加和删除项的列表?

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

$added = array_diff($new,$old);
$removed = array_diff($old,$new);
这就是上面代码返回的结果:

  • $added
    array()
    。不正确,它应该是
    数组([2]=>1)
  • $removed
    数组([2]=>10)
    。对
我做错了什么?我该如何修复它

 $added = array_diff($new,$old);
在上面的语句中,将
$new
$old
进行比较,并返回
$new
中不存在的值。没有这样的值,因此它返回一个空数组

简而言之,
array_diff()
不能处理重复的值。您必须编写一个自定义函数来实现这一点。这是:

您可以简单地像以前一样使用它:

$added   = array_diff_once($new,$old);
$removed = array_diff_once($old,$new);
这些数组的
print\r()
将正确输出:

数组
(
[2] => 1
)
排列
(
[2] => 10
)

如果要检查数组值之外的键,应使用()而不是
array\u diff()


值1在两个数组中,这是个问题…@Downvoter:您的解释可以帮助我改进这个答案。您不需要编写自己的函数。PHP有一个内置函数,可以检查数组的键。@VMai:OP没有说任何关于数组键的内容<代码>$old=数组(2,1)$新=阵列(1,2)
应该生成一个空数组,但是
打印(数组差异关联($new,$old))给出
[1,2]
。请注意,OP没有提到任何关于数组键的内容。+1和accept,即使我在相当复杂的应用程序上使用该函数时发现了一点问题。幸运的是,它很容易修复:
if($pos!==false){unset($array1[$pos]);}
@petjato:哦,对了。我忘了。我更新了答案以反映这一点。谢谢@选民:请解释我的答案有什么问题。我认为这是一个清楚的答案,它解释了OPs代码的差异。在计算差异时,这还考虑了数组中元素的位置。例如,OP的数组被重新排列:
$old=array(1,5,10)$新=阵列(5,1,1)将产生
[5,1,1]
。这是不正确的。
$added   = array_diff_once($new,$old);
$removed = array_diff_once($old,$new);
<?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";