【问题标题】:PHP group by date and IDPHP 按日期和 ID 分组
【发布时间】:2021-06-17 05:06:57
【问题描述】:

假设我有这个数组

 [
    {
                    "id": "1_8u48bxhw",
                    "patterns": [
                        "22/04/2021 08:40:54",
                        "22/04/2021 08:43:23"
                    ]
                },
                {
                    "id": "1_1ds3ygvn",
                    "patterns": [
                        "22/04/2021 08:37:45",
                        "23/04/2021 08:53:38",
                        "26/04/2021 02:30:42",
                        "26/04/2021 02:31:22",
                        "26/04/2021 02:32:02"
                    ]
                },
                {
                    "id": "1_5z9ywdxv",
                    "patterns": [
                        "22/04/2021 08:36:43",
                        "23/04/2021 08:52:18",
                        "23/04/2021 08:53:00",
                        "23/04/2021 08:53:45",
                        "23/04/2021 08:54:04",
                        "23/04/2021 08:57:23",
                        "23/04/2021 08:57:23",
                        "23/04/2021 08:58:31"
                    ]
                },
                {
                    "id": "1_uwiyjoda",
                    "patterns": [
                        "22/04/2021 08:41:02",
                        "22/04/2021 08:41:10"
                    ]
                },
                {
                    "id": "1_zs32zdjr",
                    "patterns": [
                        "22/04/2021 08:42:38",
                        "22/04/2021 08:42:44"
                    ]
                },
                {
                    "id": "1_pr1hvl3x",
                    "patterns": [
                        "22/04/2021 08:36:58",
                        "22/04/2021 08:38:04",
                        "22/04/2021 08:38:20",
                        "22/04/2021 08:42:11"
                    ]
                }
 ]

我尝试将日期与 ID 分组。

而我的预期结果应该是:

[ {
    "id": "1_8u48bxhw",
    "dates": {
        "22/04/2021": [
          "22/04/2021 08:40:54",
          "22/04/2021 08:43:23"
        ]
     }
   },
   {
     "id": "1_1ds3ygvn",
     "dates": {
           "22/04/2021": [
               "22/04/2021 08:37:45"
            ],
            "23/04/2021": [
                "23/04/2021 08:53:38"
            ],
            "26/04/2021": [
                 "26/04/2021 02:30:42",
                 "26/04/2021 02:31:22",
                 "26/04/2021 02:32:02"
            ]
      }
    },
    // and so on...
 ]

这是我尝试过的代码

    $groupDate = array();
    $groupByDate = [];
    $watchPatterns = [];
    foreach ($watchDatetime as $watchTime) {
        $id = $watchTime['id'];
        $patterns = $watchTime['patterns'];
        $dateGrouped = null;
        if ($patterns) {
            foreach ($patterns as $pattern) {
                $dateSplit = explode(" ", $pattern);
                $date = $dateSplit[0];
                $groupDate[$date][] = $pattern;
            }
        }
        array_push($groupByDate, [
            'id' => $id,
            'dates' => $groupDate
        ]);
    }
    array_push($watchPatterns, $groupByDate);

但结果并不像我预期的那样。 下面是实际结果:

{
                    "id": "1_8u48bxhw",
                    "dates": {
                        "22/04/2021": [
                            "22/04/2021 08:40:54",
                            "22/04/2021 08:43:23"
                        ]
                    }
                },
                {
                    "id": "1_1ds3ygvn",
                    "dates": {
                        "22/04/2021": [
                            // duplicate from first
                            "22/04/2021 08:40:54",
                            "22/04/2021 08:43:23",
                             //
                            "22/04/2021 08:37:45"
                        ],
                        "23/04/2021": [
                            "23/04/2021 08:53:38"
                        ],
                        "26/04/2021": [
                            "26/04/2021 02:30:42",
                            "26/04/2021 02:31:22",
                            "26/04/2021 02:32:02"
                        ]
                    }
                },

如果您注意到第二个数组不断重复第一个数组中的日期,以此类推数组的其余部分。

【问题讨论】:

  • 您需要将每次迭代的 $groupDate 重置为一个空数组,而不仅仅是开始时的 1 init。

标签: php arrays sorting


【解决方案1】:

就像 Tobias K. 先生所说的那样。您需要为每次迭代重置数组

$groupDate = array();
    $groupByDate = [];
    foreach ($watchDatetime as $watchTime) {
        $id = $watchTime['id'];
        $patterns = $watchTime['patterns'];
        $dateGrouped = null;
        if ($patterns) {
            // new line
            $groupDate = null;
            foreach ($patterns as $pattern) {
                $dateSplit = explode(" ", $pattern);
                $date = $dateSplit[0];
                $groupDate[$date][] = $pattern;
            }

        }
        array_push($groupByDate, [
            'id' => $id,
            'dates' => $groupDate
        ]);
    }
    array_push($watchPatterns, $groupByDate);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2011-03-23
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多