【问题标题】:Convert JSON IN LARAVEL在 LARAVEL 中转换 JSON
【发布时间】: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 个或更多,并且必须是动态的。提前致谢。

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-4


    【解决方案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) 会给你你想要的输出。

      附:您没有必须投射到一个对象。它也可以作为数组使用。

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 2018-12-13
        • 2017-01-26
        • 1970-01-01
        • 2018-09-08
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多