使用 array_diff() 时的一点小坑
我们先看下手册是怎么说的:
// 求差集
array_diff(array $array, array ...$arrays): array
返回一个数组,该数组包括了所有在 array
中但是不在任何其它参数数组中的值。注意键名保留不变。 保留数组 array
里的键。
举个例子看下
$arr1 = ['1a', '2a', '3a', '1a', '8a', '2a'];
$arr2 = ['8a'];
print_r(array_diff($arr1, $arr2));
/*Array
(
[0] => 1a
[1] => 2a
[2] => 3a
[3] => 1a
[5] => 2a
)*/
再用图解释下
我们如果用它来做数组元素删除时,要注意了,它是删除了所有的,主数组中,有重复的,则就有坑了。
$arr1 = ['1a', '2a', '3a', '1a', '8a', '2a'];
$arr2 = ['1a', '2a'];
// 删除 $arr1 中的 1a, 2a
$data = array_diff($arr1, $arr2);
print_r($data);
/*Array
(
[2] => 3a
[4] => 8a
)*/
我们会看到,$arr1 数组中的两个 1a, 2a 都被清理了, 如果我们想要的效果是仅删除一次,那这里就出问题了。
而且 $arr1 中的 key 是被保留的。
所以我们使用 array_diff() 清除数组中的多个值时,要特别注意了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
符合预期,array_diff 拿 array1 数组中的每个成员,去跟其他数组去对比有没有,因此即使 array1 有两个
a1
都会到 array2 中去对比。array_diff 只比较键值;array_diff_assoc 同时比较键名与键值 。建议举个栗子什么样的场景是需要注意的。符合预期
:+1:
手册上在函数后面也解释过是返回数组的差集,符合预期
...