转置包含关联键的 2d Laravel 集合

问题描述 投票:0回答:2

我有一个包含多行关联元素的集合。我需要在不知道/指定列键的情况下将列值转换为行值。

[
  [
    '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 个有些未知/随机的键,我需要更通用的解决方案。

php laravel multidimensional-array collections transpose
2个回答
1
投票

使用“拔弦”功能。

要准确地重新创建您编写的示例:

$collection = Collection::select('brand', 'model')->get();
$array = [
    'brand' => $collection->pluck('brand')->toArray(),
    'model' => $collection->pluck('model')->toArray()
];

0
投票

使用 Laravel 方法转置 2d 集合(假设矩阵结构——所有行包含所有列):

  1. 隔离第一项的二级按键,
  2. 使用每个遇到的第二级键隔离列值,
  3. 将键与列值组合。

代码:(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);
© www.soinside.com 2019 - 2024. All rights reserved.