array_keys()不能直接提取二维数组内层去重键;需遍历各子数组用array_keys()获取键,再array_merge()合并、array_unique()去重得到唯一键列表。

PHP 7.4 中,array_keys() 本身**不能直接提取二维数组的“去重键”**,因为它只返回一维数组的键名(或满足条件的键),而二维数组的“键”是嵌套结构,没有单一的“所有键集合”概念。你真正需要的,通常是以下两种常见场景之一:
场景一:提取二维数组最外层键名并去重(其实天然不重复)
PHP 数组的键在同级中本就是唯一的,所以外层数组键无需“去重”。只需用 array_keys($arr) 即可获取所有顶层键名:
$data = [
'user1' => ['name' => 'Alice', 'age' => 30],
'user2' => ['name' => 'Bob', 'age' => 25],
'admin' => ['name' => 'Carol', 'age' => 35]
];
$topKeys = array_keys($data); // ['user1', 'user2', 'admin']
场景二:提取所有子数组中**相同的键名**(如所有用户的 'name'、'age'),并去重合并
这才是实际中更常见的“二维数组键去重”需求——即汇总所有内层数组的键,去掉重复项(比如多个用户数组都有 'name' 和 'age',最终得到唯一键列表)。
方法是:遍历二维数组,对每个子数组调用 array_keys(),再用 array_merge() 合并所有键,最后用 array_unique() 去重:
$data = [
['name' => 'Alice', 'age' => 30, 'city' => 'Beijing'],
['name' => 'Bob', 'age' => 25, 'job' => 'Engineer'],
['name' => 'Carol', 'city' => 'Shanghai', 'level' => 'Senior']
];
$allKeys = [];
foreach ($data as $item) {
$allKeys = array_merge($allKeys, array_keys($item));
}
$uniqueKeys = array_values(array_unique($allKeys)); // ['name', 'age', 'city', 'job', 'level']
// 或一行写法(PHP 7.4 支持)
$uniqueKeys = array_values(array_unique(array_merge(...array_map('array_keys', $data))));
补充说明:为什么不能直接 array_keys($arr) 得到内层键?
array_keys($arr) 对二维数组只作用于第一层——它返回的是 ['0', '1', '2'](数字键)或 ['user1', 'user2'](字符串键),**完全不触及子数组内部的键名**。要拿到内层键,必须显式遍历 + 提取。
小技巧:保留键名顺序且去重(PHP 7.4+)
如果希望结果保持首次出现的顺序(array_unique() 默认保留首次出现),上面方法已满足。若需更可控,可用 array_flip() + array_keys() 组合:
$keysFlipped = [];
foreach ($data as $item) {
foreach (array_keys($item) as $k) {
$keysFlipped[$k] = true; // 利用键唯一性自动去重
}
}
$uniqueKeys = array_keys($keysFlipped); // 顺序为首次出现顺序
不复杂但容易忽略:关键在于分清“哪一层的键”,再配合循环和 array_keys + array_unique 组合使用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











