array_unique默认区分大小写,因字符串逐字ascii比较;加sort_string不改变该行为,仅强制转字符串比较;忽略大小写去重需手动strtolower预处理或自定义遍历。

默认区分大小写,但不是靠“设置开关”控制的,而是由比较方式和数据类型共同决定的。
array_unique 默认行为:字符串严格逐字比对
调用 array_unique($arr) 时,PHP 内部使用松散比较(loose comparison),但对纯字符串数组来说,效果等同于严格字符串比对 —— 即 "Apple" 和 "apple" 被视为两个不同值,都会被保留。
- 这是因为它先尝试类型转换,而两个字符串转来转去还是字符串,最终调用的是类似
strcmp()的逻辑 - ASCII 值不同 → 比较结果不等 → 不认为重复
- 所以你看到输出里
[0] => Apple和[1] => apple同时存在
SORT_STRING 参数不会改变“是否区分大小写”,它只是明确指定比较方式
很多人误以为加了 SORT_STRING 就“启用大小写敏感”,其实它本来就是默认行为。传 SORT_STRING 只是显式声明:“所有值都强制转成字符串再比”,避免数字 1 和字符串 "1" 被误判为相同。
-
array_unique([1, "1", "apple", "Apple"], SORT_STRING)→ 去掉一个1或"1"(留哪个取决于谁先出现),但"apple"和"Apple"都留下 -
SORT_NUMERIC才会让"1"和1被当作重复,但它对字母字符串无效,甚至可能把"12abc"截断成12
真要忽略大小写去重,得自己预处理
PHP 没有内置的 case-insensitive 去重标志,必须手动统一大小写后再去重,否则无法达到目的。
- 最常用做法:
$unique = array_unique(array_map('strtolower', $arr)) - 注意:这会丢失原始大小写形式,如果需要保留首次出现的原样值(比如首字母大写的
"Apple"),就得用foreach+ 关联键缓存:$seen = []; $result = []; foreach ($arr as $v) { $k = strtolower($v); if (!isset($seen[$k])) { $seen[$k] = true; $result[] = $v; } } -
array_flip方案不适用:因为array_flip(['Apple','apple'])会覆盖,只留最后一个,且顺序不可控
真正容易被忽略的是:array_unique 的“去重依据”始终是值本身,而不是你主观认为的“语义相同”。哪怕两个字符串在人类看来一样(比如全角/半角空格、零宽字符、不同编码的 emoji),只要二进制不同,它就认为不重复 —— 这类问题只能靠标准化预处理,没法靠改 flag 解决。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











