按指定列对集合中的行进行分组以构建 3D 结构

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

我需要对 2d Laravel 查询结果中的数据进行分组以形成 3d 结构。

在 Laravel 中,我来自

->get()->toArray()
结果的数据是:

[
    ['ts' => 1234, 'a' => 3, 'b' => 2],
    ['ts' => 1244, 'a' => 2, 'b' => 6],
    ['ts' => 1254, 'a' => 8, 'b' => 3],
]

有什么方法可以将数据转换为这样的:

[
    ['column' => 'a', 'values' => [[1234, 3], [1244, 2], [1254, 8]],
    ['column' => 'b', 'values' => [[1234, 2], [1244, 6], [1254, 3]],
]

我只是想知道是否有任何最好/有效的方法来呈现如上所述的转换。由于数据已经可用,因此再次避免重新循环,可以将其视为数据格式化问题。另外,如果可能的话,我不希望使用额外的数组。

我已经看过的内容包括

->get()->map(function())

,但是这是连续的,因此我无法在 2D 数组中获得 
values

php arrays laravel collections grouping
2个回答
2
投票
您需要映射您的项目并分别返回

ts

 值以及每列的值:

$items = Model::all(); $result = [ [ 'column' => 'a', 'values' => $items->map(function ($item) { return [$item->ts, $item->a]; }) ], [ 'column' => 'b', 'values' => $items->map(function ($item) { return [$item->ts, $item->b]; }) ], ];


如果您想组合两列的逻辑,请创建列名称的集合,并映射这些列:

$items = Model::all(); $result = collect(['a', 'b'])->map(function ($column) use ($items) { $values = $items->map(function ($item) use ($column) { return [$item->ts, $item->{$column}]; }); return compact('column', 'values'); });
    

0
投票
不要遍历所有行 n 次来隔离 n 个按列分组的数据集,而是使用 Laravel 的

reduce()

 方法(如果数据已转换为数组,则使用 PHP 的 
array_reduce()
 函数)。将引用推入结果数组将避免在填充后重新索引第一级键的需要。

代码:(

PHPize演示

var_export( $yourCollection->reduce( function ($result, $row) { static $ref; foreach (['a', 'b'] as $group) { if (!isset($ref[$group])) { $ref[$group] = ['column' => $group, 'values' => [[$row['ts'], $row[$group]]]]; $result[] =& $ref[$group]; } else { $ref[$group]['values'][] = [$row['ts'], $row[$group]]; } } return $result; } ) );
    
© www.soinside.com 2019 - 2024. All rights reserved.