array_keys不能直接将二维数组转为一维,仅能提取指定数组的键名;需配合循环遍历各子数组并调用array_keys,再合并去重才能获得所有键的一维数组。

array_keys 本身不能直接二维转一维
array_keys 的作用只是提取数组的键名,返回一个索引数组,它不处理嵌套结构。如果你尝试对二维数组直接调用 array_keys($arr),得到的只是外层数组的键(比如 [0, 1, 2]),完全不会触达内层键或值。所谓“用 array_keys 提键降维”,本质是把它作为辅助工具,配合循环或回调来收集特定层级的键——不是靠它单干。
真正需要的是遍历 + array_keys 组合取键
常见需求其实是:把二维数组中每个子数组的键,合并成一个一维数组(去重 or 不去重)。这时 array_keys 才派上用场:
- 对每个子数组调用
array_keys($sub)拿到它的所有键 - 用
array_merge或array_push(...)累积结果 - 最后可选
array_unique去重
示例:
$data = [
['name' => 'a', 'age' => 20],
['name' => 'b', 'city' => 'sh'],
['age' => 25, 'city' => 'bj']
];
$allKeys = [];
foreach ($data as $sub) {
$allKeys = array_merge($allKeys, array_keys($sub));
}
// $allKeys → ['name', 'age', 'name', 'city', 'age', 'city']
$uniqueKeys = array_unique($allKeys); // ['name', 'age', 'city']
别误用 array_keys 去“提取值”或“展平数组”
有人看到“提键”就以为能顺手把值也拉出来,但 array_keys 不接受回调,也不能指定取哪一层的值。以下操作是错的:
立即学习“PHP免费学习笔记(深入)”;
-
array_keys($data, 'name')—— 这是在外层数组里找值等于'name'的键,不是进子数组查 -
array_keys($data[0])单独用是对的,但漏掉其他子数组就只拿到第一行的键 - 想得到
['a', 'b', 25]这类值的集合?得用array_column($data, 'name'),不是array_keys
混淆键和值、忽略循环覆盖,是实际写的时候最常卡住的地方。
性能与兼容性注意点
如果二维数组很大(比如上千个子数组),反复 array_merge 会产生较多临时数组,内存增长明显。更省内存的做法是预分配 + foreach + isset 去重:
$keys = [];
foreach ($data as $sub) {
foreach (array_keys($sub) as $k) {
$keys[$k] = true; // 利用键唯一性自动去重
}
}
$keys = array_keys($keys); // 最终得到去重后的键数组
这个写法在 PHP 5.6+ 和 8.x 下行为一致,且比 array_unique(array_merge(...)) 更稳——尤其当键本身是字符串且含非 ASCII 字符时,array_unique 在某些版本默认用 string 比较,可能意外丢键。











