当存在重复的数组值

时间:2016-02-09 02:21:14

标签: php arrays array-difference

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

$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);
}

2 个答案:

答案 0 :(得分:1)

array_diff将第一个array与作为参数传递的其他array进行比较,将returnarray进行比较,其中包含所有第一个array中存在的元素,不存在于任何其他array中。由于$test1$test2都包含"blah1""blah2",而实际上没有其他值,array_diff的预期行为就是您所经历的行为,也就是说,return为空array,因为$test1中没有$test2中没有的元素。

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

答案 1 :(得分:0)

发现了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']