使用 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
)*/

再用图解释下
使用 array_diff() 时的一点小坑

我们如果用它来做数组元素删除时,要注意了,它是删除了所有的,主数组中,有重复的,则就有坑了。

$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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 6

符合预期,array_diff 拿 array1 数组中的每个成员,去跟其他数组去对比有没有,因此即使 array1 有两个 a1 都会到 array2 中去对比。array_diff 只比较键值;array_diff_assoc 同时比较键名与键值 。建议举个栗子什么样的场景是需要注意的。

10个月前 评论
Junwind (楼主) 10个月前

符合预期

10个月前 评论

手册上在函数后面也解释过是返回数组的差集,符合预期

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!