Laravel中如何无需循环单行实现子数组列值作为另一子数组的键
Laravel 无手动遍历单行转换数组方案
你给出的源数据结构:
{"metaData":[{"name":"a"},{"name":"b"}],"rows":[[1,2],[3,4],[5,6]]}
注:你给出的目标结果存在笔误,第二组["a"=>4,"b"=>5]不符合索引对应逻辑,按同位置匹配规则正确结果应为["a"=>3,"b"=>4]
最优单行实现
Laravel 集合(Collection)的高阶方法可以直接实现该转换,不需要手写foreach遍历,性能和原生手动遍历几乎无差异,代码如下:
// 转换后得到原生PHP数组 $transformed = collect($source['rows'])->map(fn($row) => array_combine($keys ??= collect($source['metaData'])->pluck('name')->all(), $row))->all();
实现逻辑说明
- 外层
collect($source['rows'])将行数据转为集合,通过map做逐行映射,不需要手动写循环结构 - 内层用
$keys ??=语法做一次性键名提取:仅第一次循环时从metaData中通过pluck('name')拿出所有键名(即['a','b']),后续循环直接复用该键名数组,避免重复提取的性能损耗 - 调用PHP原生
array_combine将键名数组和当前行的索引数组合并为关联数组 - 末尾
->all()将最终集合转回原生PHP数组
转换后的输出结构完全符合键位对应需求:
[ ["a" => 1, "b" => 2], ["a" => 3, "b" => 4], ["a" => 5, "b" => 6] ]
如果不需要极致压缩成单行,也可以提前把
$keys变量单独定义,可读性更高,性能和上述写法完全一致。
内容的提问来源于stack exchange,提问作者Wahsei
相关产品推荐
相关产品推荐

