【问题标题】:PHP Array_diff when there are duplicate array values存在重复数组值时的 PHP Array_diff
【发布时间】:2016-02-09 02:21:14
【问题描述】:

我有两个包含重复值的数组:

$test1 = Array(
        "blah1",
        "blah1",
        "blah1",
        "blah1",
        "blah2"
    );

    $test2 = Array(
        "blah1",
        "blah1",
        "blah1",
        "blah2"
    );

我正在尝试获取数组差异:

$result = array_diff($test1,$test2);

echo "<pre>";
print_r($result);

我需要它返回具有单个值 blah1 的数组,但它返回的是空数组...

我怀疑这与两个数组中存在重复值的事实有关,但不知道如何修复它......

请帮忙!!

编辑:

最终编写这个函数来解决问题:

function subtract_array($array1,$array2){
    foreach ($array2 as $item) {
        $key = array_search($item, $array1);
        unset($array1[$key]);
    }
    return array_values($array1);
}

【问题讨论】:

  • 您的解决方案很好,但如果您有$array1 = [ 'a', 'b', 'c' ]$array2 = [ 'd' ],它将失败。输出应与$array1 相同,但将是[ 'b', 'c' ],因为array_search() 在查找d 时将返回false,而unset() 将丢弃$array1 的第一个键,因为@ 987654336@。 if 应该会有所帮助(gistrun)。
  • @Acidon 我认为您应该添加自己的解决方案作为答案,因为我还没有找到更好的方法。

标签: php arrays array-difference


【解决方案1】:

array_diff 比较第一个 array 与作为参数传递的另一个 array(s) 和 returns 一个 array,包含第一个 array 中存在的所有元素不存在于任何其他arrays。由于$test1$test2都包含"blah1""blah2",并且没有其他值,实际上array_diff的预期行为是你所经历的,即return一个空的@ 987654336@,因为$test1 中没有$test2 中不存在的元素。

Further read。另外,请阅读 some theory 以了解您正在使用的内容。

【讨论】:

  • 我现在明白了,但是我应该使用什么来获得预期的效果?
  • 我想我可以遍历 test1 并删除两个数组中的每个匹配值,但正在寻找更优雅的解决方案
  • @Acidon,如果第一个数组中有 5 个“blah1”,没有“blah2”,而第二个数组保持不变,应该是什么结果?
  • 应该是 "blah1","blah1" 。 EDIT 中的函数得到结果。
  • @Acidon,我明白了。现在我明白你问的问题了:)
【解决方案2】:

发现 Acidon 自己的解决方案存在问题。问题在于unset($array[false]) 实际上会取消设置$array[0],因此需要对false 进行显式检查(正如 David Rodrigues 所指出的那样。)

function subtract_array($array1,$array2){
    foreach ($array2 as $item) {
        $key = array_search($item, $array1);
        if ( $key !== false ) {
            unset($array1[$key]);
        }
    }
    return array_values($array1);
}

一些例子

subtract_array([1,1,1,2,3],[1,2]);            // [1,1,3]
subtract_array([1,2,3],[4,5,6]);              // [1,2,3]
subtract_array([1,2,1],[1,1,2]);              // []
subtract_array([1,2,3],[]);                   // [1,2,3]
subtract_array([],[1,1]);                     // []
subtract_array(['hi','bye'], ['bye', 'bye']); // ['hi']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多