【问题标题】:Convert array of objects to object with sub-arrays in PHP在 PHP 中将对象数组转换为带有子数组的对象
【发布时间】:2017-06-26 13:18:34
【问题描述】:

我四处寻找,但没有找到完全符合我所追求的东西,也没有找到任何真正帮助我实现我想要的东西的东西。

我有来自数据库的这种格式的数据:

[
    {
        "datetime": "20170208183021",
        "ping": "11.201858520507812",
        "download": "28129628.324328355",
        "upload": "65169139.37489863"
    },
    {
        "datetime": "20170208181514",
        "ping": "7.826685905456543",
        "download": "300487650.87967044",
        "upload": "128210163.86553746"
    },
    {
        "datetime": "20170208180034",
        "ping": "19.550085067749023",
        "download": "17300126.504837424",
        "upload": "16650978.464359928"
    }
]

我想把它全部转换成这种格式:

{
    "datetime": [
        "20170208183021",
        "20170208181514",
        "20170208180034"
    ],
    "ping": [
        "11.201858520507812",
        "7.826685905456543",
        "19.550085067749023"
    ],
    "download": [
        "28129628.324328355",
        "300487650.87967044",
        "17300126.504837424"
    ],
    "upload": [
        "65169139.37489863",
        "128210163.86553746",
        "16650978.464359928"
    ]
}

我猜最好的方法是使用地图,但我不确定如何使用。任何帮助将不胜感激。

【问题讨论】:

    标签: php arrays object sub-array


    【解决方案1】:

    这是 JSON,所以假设你将它解码为一个数组:

    $array = json_decode($json, true);
    

    要动态构建它而不管有多少键,只需循环一个以获取键名并提取它们:

    foreach($array[0] as $key => $val) {
        $result[$key] = array_column($array, $key);
    }
    

    更长的路:

    foreach($array as $values) {
        foreach($values as $key => $val)
        $result[$key][] = $val;
    }
    

    编码后会是一个对象:

    $array = json_encode($result);
    

    【讨论】:

      【解决方案2】:

      这是一个工作示例。你不需要任何花哨的东西,一个简单的foreach 就可以了。

      $json = <<<EOS
      [
          {
              "datetime": "20170208183021",
              "ping": "11.201858520507812",
              "download": "28129628.324328355",
              "upload": "65169139.37489863"
          },
          {
              "datetime": "20170208181514",
              "ping": "7.826685905456543",
              "download": "300487650.87967044",
              "upload": "128210163.86553746"
          },
          {
              "datetime": "20170208180034",
              "ping": "19.550085067749023",
              "download": "17300126.504837424",
              "upload": "16650978.464359928"
          }
      ]
      EOS;
      
      $array = \json_decode($json, true);
      $results = [
          'datetime' => [],
          'ping'     => [],
          'download' => [],
          'upload'   => [],
      ];
      
      foreach ($array as $value) {
          $results['datetime'][] = $value['datetime'];
          $results['ping'][]     = $value['ping'];
          $results['download'][] = $value['download'];
          $results['upload'][]   = $value['upload'];
      }
      
      $results = \json_encode($results, JSON_PRETTY_PRINT);
      echo $results;
      

      【讨论】:

      • 按照你的建议玩了之后,我就直接去foreach ($array as $value) { foreach ($value as $key =&gt; $val) { $data[$key][] = $val; } }。 PHP 似乎创建了它需要的所有父键 :)
      • 你评论错了吗???您刚刚发布的您使用的代码直接来自另一个答案。
      猜你喜欢
      • 2018-05-29
      • 2022-01-14
      • 2022-01-20
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2018-12-04
      • 2021-06-16
      相关资源
      最近更新 更多