在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何以 json laravel 的形式返回分页

Laravel 5.6:升级 composer.json 后调用未定义的方法 ...\Store::getToken()

file_put_contents 不适用于 json laravel 和 php

Laravel 5 如何在 select 子句中使用 Carbon 转换日期相关列?

在 LARAVEL 中转换 JSON

如何在 laravel 模型中转换此 sql 查询