array_unique在PHP 8.3中默认按值松散去重并保留首个键名,支持ARRAY_UNIQUE_STRICT启用严格比较,不支持多维数组直接去重,需序列化处理,保留原键名可配合array_values重置索引。

array_unique 在 PHP 8.3 中的用法和行为与之前版本基本一致,**它默认按值去重,保留第一个出现的键名,不改变原始数组的键名结构**。去重依据是“松散比较”(即 ==),但可通过第二个参数指定严格比较或类型敏感模式。
默认去重:只看值,保留首个键名
对一维数值或字符串数组,直接调用即可:
$arr = [1, 2, 2, 3, '3', 4]; $result = array_unique($arr); // 结果:[0 => 1, 1 => 2, 3 => 3, 5 => 4] // 注意:'3' 和 3 被视为相同(松散比较),'3' 被丢弃,留下前面的整数 3
启用严格比较:区分类型和值
传入 ARRAY_UNIQUE_STRICT 标志,让 array_unique 使用 === 比较:
- 整数
3和字符串'3'不再视为重复 - 浮点数
1.0和整数1也被视为不同
$arr = [1, '1', 1.0, true]; $result = array_unique($arr, ARRAY_UNIQUE_STRICT); // 结果:[0 => 1, 1 => '1', 2 => 1.0, 3 => true](全部保留)
多维数组不能直接去重
array_unique 不支持嵌套数组或对象。若尝试对二维数组使用,会触发警告并返回 false 或意外结果:
立即学习“PHP免费学习笔记(深入)”;
$arr = [[1,2], [1,2], [3,4]]; var_dump(array_unique($arr)); // Warning: Array to string conversion, 返回奇怪结果
正确做法是先用 array_map('serialize', $arr) 转为字符串,去重后再反序列化(需确保数据可安全序列化):
$serialized = array_map('serialize', $arr);
$unique_serialized = array_unique($serialized);
$result = array_map('unserialize', $unique_serialized);
重置键名(如需连续数字索引)
array_unique 保留原键名,若需紧凑索引,额外套一层 array_values():
$arr = ['a' => 1, 'b' => 2, 'c' => 2]; $result = array_values(array_unique($arr)); // 结果:[0 => 1, 1 => 2]



















