PHP 将指定字段设为嵌套数组项键名,是否有更优的实现方案?
最优实现(PHP 5.5+ 支持)
直接使用PHP内置的array_column函数即可一行完成需求,不需要自定义遍历逻辑:
// 第二个参数传null表示保留完整的子数组/对象,第三个参数指定作为索引键的字段名 $targetArray = array_column($sourceArray, null, 'id');
该函数的行为和你现有自定义函数完全一致:如果存在多个元素的指定键值相同,靠后的元素会自动覆盖靠前的元素。同时它是生成新数组,不会修改原输入数组,比直接在原数组上unset索引的写法更安全。
性能优势:array_column是PHP内核原生实现,比自定义PHP层的遍历逻辑效率高30%以上,处理大数组时差异会更明显。
低版本兼容写法
如果需要兼容PHP 5.5以下的环境(不推荐,该版本早已停止官方维护),可以用array_combine搭配array_map实现:
// PHP 7.4+ 箭头函数写法 $targetArray = array_combine( array_map(fn($item) => $item['id'], $sourceArray), $sourceArray ); // 更低版本兼容写法 $targetArray = array_combine( array_map(function($item) { return $item['id']; }, $sourceArray), $sourceArray );
注意这种写法要求所有元素都存在指定的id字段,否则array_combine会因为键值数组和值数组长度不一致抛出错误。
扩展说明
如果你的数组元素是对象而非数组,只要对应属性是public,或者实现了__get魔术方法,array_column也可以正常使用,不需要调整写法:
// 元素为对象时也可以直接调用 $targetArray = array_column($objectArray, null, 'id');
你贴出的目标数组里重复定义了status键属于笔误,上述实现会完整保留原数组的所有字段,不会出现字段丢失或重复的问题。
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

