在 LARAVEL 中转换 JSON
Posted
技术标签:
【中文标题】在 LARAVEL 中转换 JSON【英文标题】:Convert JSON IN LARAVEL 【发布时间】:2021-09-06 21:52:26 【问题描述】:这是我的 JSON
[
"TIMESTAMP": "2021-06-09 13:13:26",
"COL1": "10",
"COL2": "20",
"COL3": "30"
,
"TIMESTAMP": "2021-06-22 13:13:26",
"COL1": "20",
"COL2": "30",
"COL3": "40"
,
"TIMESTAMP": "2021-06-21 13:13:26",
"COL1": "1",
"COL2": "2",
"COL3": "3"
,
"TIMESTAMP": "2021-06-20 13:13:26",
"COL1": "40",
"COL2": "50",
"COL3": "60"
]
我需要根据(EXPECTED OUTPUT)
这样的列名重构json[
"TITLE":"COL1"
"DATA":[10,20,1,40]
,
"TITLE":"COL2"
"DATA":[20,30,2,50]
,
"TITLE":"COL3"
"DATA":[30,40,3,60]
,
]
我试过了,但是没用
$data = json_decode($result, true);
$refactored = array_map(function($item)
return (object)[
'TIMESTAMP' => $item['TIMESTAMP'],
'DATA' => [ $item['COL1'], $item['COL2'], $item['COL3'] ]
];
, $data);
dump($refactored);
有人帮我解决这个问题。该列可能是 3 个或更多,并且必须是动态的。提前致谢。
【问题讨论】:
【参考方案1】:您可以像这样转换您的 JSON:
$data = json_decode($result, true);
$refactored = array_reduce($json, function($carry, $item)
foreach($item as $key => $value)
if (str_starts_with($key, 'COL'))
$index = substr($key, 3, 1) - 1;
if (!isset($carry[$index]))
$carry[$index] = [
'Title' => $key
];
$carry[$index]['Data'][] = $value;
return $carry;
, []);
dump($refactored);
【讨论】:
兄弟,列总是不以COL开头..在这种情况下我们需要做什么。 你告诉我。除了 COL* 之外的键应该怎么办? 可以是任何名字 我明白了。但是您的示例中的 TIMESTAMP 列丢失了。为什么?【参考方案2】:我一直喜欢使用您希望将数据分组的值作为临时数组键,这使事情变得更容易,并且可以在之后使用 array_values 简单地重置。
$input = json_decode('…', true);
$output = [];
foreach($input as $item)
foreach($item as $key => $value)
if($key != 'TIMESTAMP')
$output[$key]['TITLE'] = $key;
$output[$key]['DATA'][] = (int)$value;
$output = array_values($output);
echo json_encode($output);
【讨论】:
【参考方案3】:您所要做的就是重新编码处理后的数据:
json_encode($refactored)
会给你你想要的输出。
附:您没有必须投射到一个对象。它也可以作为数组使用。
【讨论】:
以上是关于在 LARAVEL 中转换 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.6:升级 composer.json 后调用未定义的方法 ...\Store::getToken()
file_put_contents 不适用于 json laravel 和 php