array_unique默认使用松散比较,故0与"0"被视为相同而被去重;启用sort_regular可严格区分类型,使0和"0"保留为不同元素,而sort_string仍会将二者转为相同字符串导致去重。

array_unique 默认会把 0 和 "0" 当作相同值
因为 array_unique 默认使用松散比较(类似 ==),而 PHP 中 0 == "0" 为 true。所以这个数组:
$arr = [0, "0", 1, "1"];
执行 array_unique($arr) 后只剩两个元素:[0, 1],"0" 和 "1" 全被去掉了。
用 SORT_REGULAR 标志严格区分类型
这个标志让 array_unique 按照原始类型和值一起判断是否重复,不再做隐式转换:
-
0(整型)和"0"(字符串)会被视为不同元素 -
true和1也不再等价 - 但注意:它不解决大小写问题,
"A"和"a"仍是不同值
示例:
$arr = [0, "0", 1, "1", true, false];
array_unique($arr, SORT_REGULAR) 返回 [0, "0", 1, "1", true, false] —— 全部保留。
为什么 SORT_STRING 不行?
SORT_STRING 会把所有值都转成字符串再比,所以 0 → "0","0" → "0",结果还是去重掉一个。
换句话说:
-
SORT_STRING:统一转字符串 →0和"0"变成同一个字符串 → 去重 -
SORT_REGULAR:保持原类型比较 →0 !== "0"→ 不去重
多维或含非标量数据时不能依赖 array_unique
如果数组里有数组、对象或 null,array_unique 会直接报 Warning 或返回不可预期结果(比如跳过整个子项)。
此时必须手动处理,常见做法是:
- 用
serialize()把每个元素转成唯一字符串再哈希去重 - 对关键字段(如 ID + type)拼接字符串作为判重键
- 避免直接传
array_unique给混合结构
真正需要区分 0 和 "0" 的场景,往往也意味着你正在处理协议字段、数据库导出数据或 API 输入——这些地方类型语义敏感,SORT_REGULAR 是最轻量且可靠的选择。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











