PHP JSON 数组 - 按相同值分组

4

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

我从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

我有一个 PHP 变量叫做 $Data,其中包含一些数据。

是否可以使用 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 甚至提供了一个 FETCH_GROUP 选项来 fetchAll(),这将产生这种结构(或多或少)。 - Michael Berkowski
我在php变量$Data中拥有来自MySQL的结果。 - Jhonatan Sandoval
好的,但是$Data的实际PHP内容是什么?请通过print_r($Data);展示一个有限的样本,并且发布您用于从MySQL中提取行到$Data的PHP代码。 - Michael Berkowski
你发布的所需结构中的分组输出有点奇怪 - 一个包含一个属性(日期)的对象数组,每个对象都包含在外部数组中。更合理的做法是使用一个外部对象,其中每个键(日期)都是一个对象数组。这样可以减少两个嵌套级别。 - Michael Berkowski
类似于 {"2014-12-01": [{"StartTime": "10:00", "EndTime":"16:00"},{"StartTime": "10:00","EndTime": "16:00"}],"2014-12-02":[{"StartTime":"12:00","EndTime":"18:00"}] - Michael Berkowski
@MichaelBerkowski 是的,就像那样。 - Jhonatan Sandoval
2个回答

6

根据问题中概述的结构:

需要php 5.4+才能进行json漂亮打印,如果你使用的版本较低,请将其移除并使用长数组格式。

$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数组中),您需要像这样将$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"
    }
  ]
}

1

雇主名称 数据路径 Alp 1. 视频链接 2. 视频链接 Xyz 1. 视频链接 2. 视频链接 3. 视频链接

$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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接