求助:PHP如何按日期值合并数组
按date值合并PHP数组的解决方案
array_merge()无法直接实现按date分组合并的需求——它仅做数组的简单合并,不会根据特定键分组,且重复键名会被覆盖。以下是两种可行的实现方案:
方案1:保留原带数字后缀的键名(匹配你期望的格式逻辑)
该方案将相同date的项合并到同一数组中,保留原始的enterN/exitN/groupN键名:
$original = [ ['date' => 14, 'enter1' => '2024-01-14 15:46:58', 'exit1' => '2024-01-14 19:46:58', 'group1' => 2], ['date' => 15, 'enter1' => '2024-01-15 15:47:58', 'exit1' => '2024-01-15 15:51:11', 'group1' => 1], ['date' => 15, 'enter2' => '2024-01-15 18:11:33', 'exit2' => '2024-01-15 19:11:33', 'group2' => 2], ['date' => 15, 'enter3' => '2024-01-15 15:48:22', 'exit3' => '2024-01-15 17:25:43', 'group3' => 3], ]; $merged = []; foreach ($original as $item) { $date = $item['date']; unset($item['date']); // 移除date键,仅保留业务字段 if (!isset($merged[$date])) { // 首次遇到该date,初始化数组并保留date字段 $merged[$date] = ['date' => $date]; } // 合并当前项的字段到对应date的数组中 $merged[$date] = array_merge($merged[$date], $item); } // 将关联数组转为索引数组,符合目标格式 $merged = array_values($merged); // 输出结果 echo '<pre>'; print_r($merged); echo '</pre>';
运行结果:
Array ( [0] => Array ( [date] => 14 [enter1] => 2024-01-14 15:46:58 [exit1] => 2024-01-14 19:46:58 [group1] => 2 ) [1] => Array ( [date] => 15 [enter1] => 2024-01-15 15:47:58 [exit1] => 2024-01-15 15:51:11 [group1] => 1 [enter2] => 2024-01-15 18:11:33 [exit2] => 2024-01-15 19:11:33 [group2] => 2 [enter3] => 2024-01-15 15:48:22 [exit3] => 2024-01-15 17:25:43 [group3] => 3 ) )
方案2:解决键名冲突(更推荐的结构化方案)
PHP数组不允许重复键名,你期望的结构中多个group键会被覆盖。该方案将每组数据转为子数组,结构更清晰,便于后续业务处理:
$original = [ ['date' => 14, 'enter1' => '2024-01-14 15:46:58', 'exit1' => '2024-01-14 19:46:58', 'group1' => 2], ['date' => 15, 'enter1' => '2024-01-15 15:47:58', 'exit1' => '2024-01-15 15:51:11', 'group1' => 1], ['date' => 15, 'enter2' => '2024-01-15 18:11:33', 'exit2' => '2024-01-15 19:11:33', 'group2' => 2], ['date' => 15, 'enter3' => '2024-01-15 15:48:22', 'exit3' => '2024-01-15 17:25:43', 'group3' => 3], ]; $merged = []; foreach ($original as $item) { $date = $item['date']; unset($item['date']); // 提取键名的基础部分(去掉末尾数字),统一字段名 $groupData = []; foreach ($item as $key => $value) { $baseKey = preg_replace('/\d+$/', '', $key); $groupData[$baseKey] = $value; } if (!isset($merged[$date])) { $merged[$date] = [ 'date' => $date, 'groups' => [] ]; } $merged[$date]['groups'][] = $groupData; } $merged = array_values($merged); // 输出结果 echo '<pre>'; print_r($merged); echo '</pre>';
运行结果:
Array ( [0] => Array ( [date] => 14 [groups] => Array ( [0] => Array ( [enter] => 2024-01-14 15:46:58 [exit] => 2024-01-14 19:46:58 [group] => 2 ) ) ) [1] => Array ( [date] => 15 [groups] => Array ( [0] => Array ( [enter] => 2024-01-15 15:47:58 [exit] => 2024-01-15 15:51:11 [group] => 1 ) [1] => Array ( [enter] => 2024-01-15 18:11:33 [exit] => 2024-01-15 19:11:33 [group] => 2 ) [2] => Array ( [enter] => 2024-01-15 15:48:22 [exit] => 2024-01-15 17:25:43 [group] => 3 ) ) ) )
内容的提问来源于stack exchange,提问作者GT80
相关产品推荐
相关产品推荐

