我需要对 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
。
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');
});
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;
}
)
);