好的,所以不是 100% 確定如何正確地提出這個問題,但我有一個陣列,我試圖根據每小時將其合并和分組,然后是該時間下每年的資料。
我當前的陣列如下所示:
[
{
"name": "7:00 AM",
"data": [
{
"x": "2019",
"y": 1
}
]
},
{
"name": "7:00 AM",
"data": [
{
"x": "2020",
"y": 221
}
]
}
]
因此,我希望根據name值將這些組合成一個陣列,然后將所有這些data組合在一起:
[
{
"name": "7:00 AM",
"data": [
{
"x": "2019",
"y": 1
},
{
"x": "2020",
"y": 221
}
]
}
]
編輯:為了添加我最初獲取和格式化這些值的方式,我正在使用 Larvel 并運行以下查詢:
$shipments = Orders::whereNotNull('shipped_at')->groupBy(DB::raw('YEAR(created_at)'))->selectRaw('count(*) as count, HOUR(shipped_at) as hour')->selectRaw("DATE_FORMAT(created_at, '%Y') label")->orderBy('label')->orderBy('hour')->groupBy('hour')->get();
這給了我以下資料:

然后我像這樣構建原始陣列:
$shipping_chart_year = [];
foreach ($shipments as $item) {
$hour = Carbon::parse($item['hour'] . ':00:00')->timezone('America/Chicago')->format('g:i A');
$shipping_chart_year[] = ['name' => $hour, 'data' => [['x' => $item['label'], 'y' => $item['count']]]];
}
uj5u.com熱心網友回復:
此函式按照您的預期格式化陣列。
function formatArray($array){
$response = [];
$keysIndexes = [];
foreach($array as $value) {
if(!array_key_exists($value['name'], $keysIndexes)) {
array_push($response, $value);
$keysIndexes[$value['name']] = sizeof($keysIndexes);
} else {
array_push($response[$keysIndexes[$value['name']]]['data'], $value['data'][0]);
}
}
return $response;
}
uj5u.com熱心網友回復:
如果你想用 Laravel Collections 來實作這一點(你可以用它做很多事情!),你去吧(基于你當前的陣列結構)。
它更具可讀性,更容易實作。
$output = collect(json_decode($data, true))
->groupBy('name')
->transform(function ($items, $name) {
// Merge nested arrays into one
$data = $items->map(function ($item) {
return $item['data'][0];
})->toArray();
return [
'name' => $name,
'data' => $data,
];
})
->values() // removes the key
->toJson(); // returns the collection to json
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361743.html
上一篇:未定義的索引陣列
下一篇:403此操作未經授權
