我有两个包含重复值的数组:
$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);
}
答案 0 :(得分:1)
array_diff
将第一个array
与作为参数传递的其他array
进行比较,将return
与array
进行比较,其中包含所有第一个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']