正确做法是先用array_keys提取各数组键名,再用array_merge合并键数组,最后用array_unique去重;不能直接array_merge原数组再取键,否则数字键被重置、同名字符串键被覆盖。

PHP 合并数组后获取所有不重复的键,核心是“提取键名”+“去重”,而不是直接依赖合并函数(如 array_merge)——因为 array_merge 会**重置数字键、覆盖同名字符串键**,导致键信息丢失。所以正确做法是:先收集所有数组的键,再统一去重。
用 array_keys() + array_unique() + array_merge()
这是最直观可靠的方法:分别取出每个数组的键,合并成一个一维键数组,再去除重复项。
-
array_keys($arr)返回数组所有键(含字符串和数字键) -
array_merge(...$keyArrays)合并多个键数组(PHP 5.6+ 支持展开操作符) -
array_unique()去重,保留首次出现的键(默认 SORT_STRING 比较) - 如需保持原始顺序且去重,后续可加
array_values()重排索引
示例:
php$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 3, 'c' => 4, 0 => 'num'];
$arr3 = ['a' => 5, 1 => 'another'];
$allKeys = array_unique(array_merge(
array_keys($arr1),
array_keys($arr2),
array_keys($arr3)
));
// 结果:['a', 'b', 'c', 0, 1]
?>
处理数字键时注意保留还是忽略
数字键(如 0, 1, 2)是否算作“有意义的键”,取决于业务场景。如果只关心关联键(字符串键),可过滤:
- 用
array_filter($keys, 'is_string')筛出纯字符串键 - 或用
array_filter($keys, function($k) { return !is_int($k); })排除整数键 - 注意:
array_keys($arr, null, true)不能按类型筛选键,只能筛选值
一行简洁写法(PHP 7.4+)
结合箭头函数与展开语法,可压缩为单行(适合简单场景):
语义清晰,但调试稍难;生产环境建议分步写,便于排查键来源。
避免踩坑:别用 array_merge 直接合并再取键
错误示例:
$merged = array_merge($arr1, $arr2, $arr3);$keys = array_keys($merged); // ❌ 数字键被重置,同名字符串键只留最后一个
例如 $arr1 = ['id'=>1] 和 $arr2 = ['id'=>2] 合并后只剩一个 'id',看似“不重复”,实则丢失了本应被识别的“冲突提示”。真正需求是“所有出现过的键”,而非“合并后剩下的键”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











