如何在PHP中对多维对象数组动态排序并去重关联日期?
PHP数组去重分组并关联日期排序解决方案
需求说明
需要将给定的PHP数组按name去重,每个名称关联对应的日期和visit_total数据,并支持动态排序。期望输出结构类似:
{ "Player": [ {"date": "2021/04/29", "visit_total": 3}, {"date": "2022/01/20", "visit_total": 4}, {"date": "2022/07/29", "visit_total": 1} ], "Player2": [ {"date": "2022/03/26", "visit_total": 1}, {"date": "2022/06/08", "visit_total": 1} ], "Player3": [ {"date": "2022/09/05", "visit_total": 1} ] }
实现代码
<?php // 原数组(示例数据) $originalArray = [ (object)[ "name" => "Player", "role_id" => 1, "date" => "2021/04/29", "visit_1" => "0", "visit_total" => "3", "weekly_history" => '[{"week": "2021/04/29", "visit_1": 0, "visit_total": 1}, {"week": "2021/04/29", "visit_1": 0, "visit_total": 1}, {"week": "2021/04/29", "visit_1": 0, "visit_total": 1}]' ], (object)[ "name" => "Player2", "role_id" => 1, "date" => "2022/03/26", "visit_1" => "0", "visit_total" => "1", "weekly_history" => '[{"week": "2022/03/26", "visit_1": 0, "visit_total": 1}]' ], (object)[ "name" => "Player", "role_id" => 3, "date" => "2022/01/20", "visit_1" => "0", "visit_total" => "4", "weekly_history" => '[{"week": "2022/01/20", "visit_1": 0, "visit_total": 1}, {"week": "2022/01/20", "visit_1": 0, "visit_total": 1}, {"week": "2022/01/20", "visit_1": 0, "visit_total": 1}, {"week": "2022/01/20", "visit_1": 0, "visit_total": 1}]' ], (object)[ "name" => "Player2", "role_id" => 2, "date" => "2022/06/08", "visit_1" => "0", "visit_total" => "1", "weekly_history" => '[{"week": "2022/06/08", "visit_1": 0, "visit_total": 1}]' ], (object)[ "name" => "Player", "role_id" => 2, "date" => "2022/07/29", "visit_1" => "0", "visit_total" => "1", "weekly_history" => '[{"week": "2022/07/29", "visit_1": 0, "visit_total": 1}]' ], (object)[ "name" => "Player3", "role_id" => 2, "date" => "2022/09/05", "visit_1" => "0", "visit_total" => "1", "weekly_history" => '[{"week": "2022/09/05", "visit_1": 0, "visit_total": 1}]' ] ]; // 1. 按name分组,收集日期和visit_total $groupedData = []; foreach ($originalArray as $item) { $name = $item->name; // 转换visit_total为整数 $visitTotal = (int)$item->visit_total; // 向对应name的数组添加数据 $groupedData[$name][] = [ 'date' => $item->date, 'visit_total' => $visitTotal ]; } // 2. 对每组内的日期进行动态排序(按日期升序,可修改排序逻辑) foreach ($groupedData as &$items) { usort($items, function($a, $b) { // 转换为时间戳比较 $dateA = strtotime($a['date']); $dateB = strtotime($b['date']); return $dateA - $dateB; // 升序,倒序则$dateB - $dateA }); } unset($items); // 解除引用 // 输出结果(可转为JSON格式) echo json_encode($groupedData, JSON_PRETTY_PRINT); ?>
代码说明
- 分组去重:遍历原数组,以
name作为键,自动实现名称去重,同时收集对应条目的date和visit_total数据。 - 动态排序:通过
usort结合时间戳比较,可灵活调整每组内日期的排序规则(升序/降序)。 - 类型校正:将字符串类型的
visit_total转为整数,保证数据类型统一。
输出结果
运行代码后,会输出格式化后的JSON结构,完全匹配需求示例的格式。
内容的提问来源于stack exchange,提问作者Asfos22
相关产品推荐
相关产品推荐

