我有一个包含多行关联元素的集合。我需要在不知道/指定列键的情况下将列值转换为行值。
[
[
'brand' => 'brand1',
'model' => 'model1'
],[
'brand' => 'brand2',
'model' => 'model2'
],[
'brand' => 'brand3',
'model' => 'model3'
],[
'brand' => 'brand4',
'model' => 'model4'
],
]
我想要:
[
'brand' => ['brand1', 'brand2', 'brand3', 'brand4' ],
'model' => ['model1', 'model2', 'model3', 'model4' ]
]
我需要做什么才能将第一种格式转换为另一种格式。最好不使用循环(我知道如何这样做)并使用 Laravel 集合方法作为一个衬垫。
编辑。我忘了提及品牌和型号只是示例,如果集合包含 N 个有些未知/随机的键,我需要更通用的解决方案。
使用“拔弦”功能。
要准确地重新创建您编写的示例:
$collection = Collection::select('brand', 'model')->get();
$array = [
'brand' => $collection->pluck('brand')->toArray(),
'model' => $collection->pluck('model')->toArray()
];
使用 Laravel 方法转置 2d 集合(假设矩阵结构——所有行包含所有列):
代码:(PHPize演示)
var_export(
collect($collection->first())->keys()
->pipe(
fn($colNames) => $colNames->combine(
$colNames->map(
fn($col) => $collection->pluck($col)
)
)
)
->toArray()
);
从主题上讲,here是 Laravel 宏的一个示例,它将转置包含两个级别上的数字键的二维集合。换句话说,它不适合这个问题。
这个答案表明患者有一种可用的
transpose()
方法。
在 laravel 中旋转集合旨在转置索引集合的索引集合,答案推荐嵌套循环和 spatie 宏。
我发现的所有宏都使用扩展运算符,因此不适合具有关联键的有效负载。例如 laravel-collection-macros/src/Macros /转置.php
一种更简单/更简单的方法是使用本机 PHP 循环来构建新结构。非框架转置技术可以在here找到。请注意,如果 2d 数组中只有 1 行,则使用
array_map(null, ...$array)
将给出 1d 结果。
代码:(PHPize演示)
$result = [];
foreach ($collection->all() as $index => $row) {
foreach ($row as $key => $value) {
$result[$key][$index] = $value;
}
}
var_export($result);