【问题标题】:PHP JSON Array - Group by the same valuePHP JSON 数组 - 按相同值分组
【发布时间】:2015-02-04 07:56:41
【问题描述】:

我正在考虑如何按具有相同值的对象对我的数组进行分组。

我从 MySQL 查询得到这个结果:

   Date           StartTime           EndTime
2014-12-01          08:00              12:00
2014-12-01          10:00              16:00
2014-12-02          12:00              18:00
2014-12-03          10:00              20:00

我在一个名为 $Data 的 PHP 变量中保存了这些数据。

有没有可能用php: 得到这样的json数组?

[
    {
        "2014-12-01": [
            {
                "StartTime": "08:00",
                "EndTime": "12:00"
            },
            {
                "StartTime": "10:00",
                "EndTime": "16:00"
            }
        ]
    },
    {
        "2014-12-02": [
            {
                "StartTime": "12:00",
                "EndTime": "18:00"
            }
        ]
    },
    {
        "2014-12-03": [
            {
                "StartTime": "10:00",
                "EndTime": "20:00"
            }
        ]
    }
]

如果我使用echo json_encode($Data),结果是:

[
    {
        "Date": "2014-12-01",
        "StartTime": "10:00",
        "EndTime": "16:00"
    },
    {
        "Date": "2014-12-02",
        "StartTime": "12:00",
        "EndTime": "18:00"
    },
    {
        "Date": "2014-12-03",
        "StartTime": "10:00",
        "EndTime": "20:00"
    }
]

【问题讨论】:

  • 当然可以。您在 PHP 代码中使用什么 MySQL API?对于大多数人来说,您必须在获取时构建数组,但 PDO 甚至提供了a FETCH_GROUP option to fetchAll(),它会产生这种结构(或多或少)。
  • 我在一个名为 $Data 的 php 变量中有 MySQL 的结果。
  • 好的,但是$Data 的实际 PHP 内容是什么?请通过print_r($Data); 显示它的有限示例,并将用于从 MySQL 获取行的 PHP 代码发布到$Data
  • 您发布所需结构的分组输出有点奇怪 - 一个外部对象数组,每个对象都包含一个属性(日期),它是一个对象数组。拥有一个带有键(日期)的外部对象会更有意义,每个对象都是一个对象数组。嵌套层数减少 2 个。
  • 点赞{"2014-12-01": [{"StartTime": "10:00", "EndTime":"16:00"},{"StartTime": "10:00","EndTime": "16:00"}],"2014-12-02":[{"StartTime":"12:00","EndTime":"18:00"}]

标签: php arrays json grouping


【解决方案1】:

雇主名称数据路径 阿尔卑斯山 1. video_link 2. 视频链接 Xyz 1. video_link 2. 视频链接 3. video_link

$stmt = $this->conn->prepare("SELECT a.employer_name,b.data_path FROM 
rec_experience a INNER JOIN rec_multi_upload_data b 
ON(a.rec_uniqueid=b.rec_id) WHERE b.data_type='Video'  ORDER BY 
a.c_date DESC ");
$stmt->execute();
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);

$out = [];

foreach($res as $element)
{
 $out[$element['employer_name']][] = ['video_link' => 
 $element['data_path']];
}
echo json_encode($out);

【讨论】:

    【解决方案2】:

    根据问题中概述的结构:

    json 漂亮打印需要 php 5.4+,如果您使用的是较低版本,只需将其删除并使用长数组格式。

    $in = <<<'JSON'
    [
        {
            "Date": "2014-12-01",
            "StartTime": "10:00",
            "EndTime": "16:00"
        },
        {
            "Date": "2014-12-02",
            "StartTime": "12:00",
            "EndTime": "18:00"
        },
        {
            "Date": "2014-12-03",
            "StartTime": "10:00",
            "EndTime": "20:00"
        },
        {
            "Date": "2014-12-03",
            "StartTime": "12:00",
            "EndTime": "20:00"
        }
    ]
    JSON;
    
    $data = json_decode($in, true);
    $out = [];
    
    foreach($data as $element) {
            $out[$element['Date']][] = ['StartTime' => $element['StartTime'], 'EndTime' => $element['EndTime']];
    }
    
    var_dump(json_encode($out, JSON_PRETTY_PRINT));
    

    要获得与问题中完全相同的输出(返回的输出包装在单个元素 json-array 中,您需要将 $out 包装在另一个数组中,如下所示:

    json_encode([$out], JSON_PRETTY_PRINT)

    结果:

    {
      "2014-12-01": [
        {
          "StartTime": "10:00",
          "EndTime": "16:00"
        }
      ],
      "2014-12-02": [
        {
          "StartTime": "12:00",
          "EndTime": "18:00"
        }
      ],
      "2014-12-03": [
        {
          "StartTime": "10:00",
          "EndTime": "20:00"
        },
        {
          "StartTime": "12:00",
          "EndTime": "20:00"
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 2017-06-26
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多