array_unique 默认用==比较导致类型转换,如"1"和1被当作相等;应加sort_string参数强制字符串比较,并用array_values重索引,其保留首次出现的键。

array_unique 为什么删不掉重复的字符串?
因为 array_unique 默认用 == 比较,会做类型转换。比如 "1" 和 1 被当成相等,其中一个就被去掉了。
- 实际场景:从数据库或表单读出混合类型的值(如 ID 字段既有数字又有字符串),直接丢进
array_unique后少元素 - 解决方法:加第三个参数
SORT_STRING,强制按字符串比较:$arr = ["1", 1, "2", 2];<br>var_dump(array_unique($arr, SORT_STRING)); // 保留全部4个
- 注意:用了
SORT_STRING后,数组键名不会重排,但值顺序可能变(内部按字典序临时排序)
保留原始键名但又想重新索引怎么办?
array_unique 本身不重置键,但很多人误以为它会返回连续数字键 —— 它不会。你得自己补一步。
- 常见错误:用
array_values(array_unique($arr))看似能重索引,但要注意——如果原数组有非数字键(比如['a' => 'x', 'b' => 'y']),array_values是安全的;但如果原数组是数字键但不连续(如[0=>'x', 5=>'y']),这步没问题 - 性能提醒:
array_values是 O(n) 操作,对超大数组(>10 万项)建议先确认是否真需要重索引 - 别写成
array_merge(...)或array_keys(array_flip(...)),后者在值为数组或对象时直接报错
关联数组去重只看 value,key 怎么保留第一个出现的?
array_unique 就是这么干的:遇到重复 value,留下**最早出现的那个 key**,后面同 value 的 key 全丢。但前提是别用错参数。
- 默认行为(不传 flag)已满足该需求,无需额外操作
- 陷阱:如果用了
SORT_REGULAR或SORT_NUMERIC,内部会先排序再去重,导致“第一个出现”变成“排序后第一个”,键就乱了 - 验证方式:打印
array_keys(array_unique($arr)),对比原数组对应位置的 key 是否一致 - 示例:
$arr = ['a' => 'x', 'b' => 'y', 'c' => 'x'];<br>// 结果保留 'a'=>'x','c'=>'x' 被删
PHP 8.3+ 用 array_unique 处理嵌套数组失败?
是的。array_unique 只支持一维,遇到子数组会触发警告并把整个子数组当作 NULL 处理(PHP 7.2+ 改为抛 TypeError)。
立即学习“PHP免费学习笔记(深入)”;
- 错误现象:
TypeError: array_unique(): Argument #1 ($array) must be of type array, array given—— 实际是子项含数组,不是参数类型错 - 替代方案:用
array_reduce+serialize手动判重(仅适用于可序列化的值):$unique = array_reduce($arr, function($carry, $item) {<br> $s = serialize($item);<br> if (!in_array($s, $carry['seen'])) {<br> $carry['result'][] = $item;<br> $carry['seen'][] = $s;<br> }<br> return $carry;<br>}, ['result' => [], 'seen' => []])['result']; - 注意:
serialize对 Closure、resource、部分对象无效;生产环境慎用,优先考虑重构数据结构











