array_unique默认用松散比较,false和0被视为相等;sort_string模式下false转""、0转"0",二者不等但false与""相等;需严格区分时必须手动遍历或序列化处理。

会混在一起,而且默认行为就是如此。
array_unique 默认用松散比较,false 和 0 被视为相等
PHP 的 array_unique() 默认不传 $flags 时,底层使用类似 == 的松散比较。这意味着:
-
false、0、"0"、空字符串""在比较中都转为布尔false或数字0 - 只要其中一个先出现,后面所有“等价”值都会被去重掉
例如:
php $array = [false, 0, "0", "", true, 1]; $result = array_unique($array); print_r($result); // 输出:Array ( [0] => [4] => 1 ) // 注意:索引 0 的 false 留下,0、"0"、"" 全被当作重复剔除
SORT_STRING 模式下,false 和 0 都变成字符串 "0"
显式传 SORT_STRING 时,所有值强制转字符串再比:
-
false→""(空字符串) -
0→"0" - 所以它们不会被当成相同值(因为
"" !== "0")
但注意:false 和 "" 在 SORT_STRING 下都变成 "",反而会混。
php $array = [false, "", 0, "0"]; $result = array_unique($array, SORT_STRING); // 结果保留 [0 => false, 2 => 0] —— 因为 false/"" 同为 "",0/"0" 同为 "0"
需要严格区分 false 和 0?别用 array_unique 默认行为
如果你的数组里明确要保留 false 和 0 作为不同语义的值(比如状态字段:false=未设置,0=已关闭),那就不能依赖 array_unique() 的任何内置模式。
- 必须手动遍历 +
===判断 - 或用
serialize($item)生成唯一键,绕过类型转换 - 尤其注意:
array_unique($array, SORT_REGULAR)仍可能在某些 PHP 版本中对false/0松散处理,不可靠
最易被忽略的一点:你根本没法靠加个 flag 就让 array_unique 安全地区分 false 和 0——它不是为这种场景设计的。真有强类型需求,就得自己写循环。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











