如何使用PHP对数组按年份分组、去重并按ID排序?

2026-04-30 13:022阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计694个文字,预计阅读时间需要3分钟。

如何使用PHP对数组按年份分组、去重并按ID排序?

原文:

在实际开发中,常需对多维数组进行“按字段分组 + 去重 + 排序”的组合处理。例如,给定一组记录 [['id' => 1, 'year' => 1999], ['id' => 1, 'year' => 2022], ...],目标是按 year 合并所有对应 id,并对每个年份下的 id 去重后升序排列(注意:原始数据中同一 year 可能含重复 id,但结果中应唯一)。

虽然示例答案中未显式去重,但根据预期输出 "2020" : "1", "2"(而非 "1", "1", "2"),去重是隐含需求。因此,我们优化原逻辑,在添加 ID 前使用 in_array() 判断是否已存在,或更高效地采用 array_unique() 在分组后统一去重。

以下是完整、健壮的实现:

<?php function groupItemsByIdYear($input) { $groupedByYear = []; // 第一步:按 year 分组,收集所有 id(含潜在重复) foreach ($input as $item) { $year = (int)$item['year']; // 强制转为整型,避免字符串年份导致排序异常 $id = (int)$item['id']; if (!isset($groupedByYear[$year])) { $groupedByYear[$year] = []; } $groupedByYear[$year][] = $id; } // 第二步:对每个年份下的 id 数组去重 + 升序排序 foreach ($groupedByYear as $year => &$ids) { $ids = array_values(array_unique($ids)); // 去重并重置索引 sort($ids, SORT_NUMERIC); // 数值升序排序 } // 第三步:按键(year)降序排列,使结果按年份从新到旧展示(可选,符合常见阅读习惯) krsort($groupedByYear); return $groupedByYear; } // 示例数据 $items = [ ['id' => 1, 'year' => 1999], ['id' => 1, 'year' => 2022], ['id' => 2, 'year' => 2020], ['id' => 1, 'year' => 2020], ['id' => 2, 'year' => 2020], // 重复 id+year,验证去重效果 ]; $result = groupItemsByIdYear($items); print_r($result); ?>

输出示例:

立即学习“PHP免费学习笔记(深入)”;

Array ( [2022] => Array ( [0] => 1 ) [2020] => Array ( [0] => 1 [1] => 2 ) [1999] => Array ( [0] => 1 ) )

关键要点说明:

  • 使用 (int) 强制类型转换,避免 '2020'(字符串)与 2020(整数)被视为不同键;
  • array_unique() 确保每个年份下 ID 无重复,sort(..., SORT_NUMERIC) 保证数值正确排序(而非字典序);
  • krsort() 按年份降序排列结果,便于直观查看最新年份优先(如需升序,改用 ksort());
  • array_values() 重置数组索引,确保返回标准数字索引数组,兼容 JSON 序列化等场景。

此方案简洁、可读性强,不依赖高阶函数,兼容 PHP 5.6+,适用于数据量适中的业务场景。若需处理海量数据,建议结合数据库 GROUP BY year, id 与 DISTINCT 提前聚合。

标签:PHP

本文共计694个文字,预计阅读时间需要3分钟。

如何使用PHP对数组按年份分组、去重并按ID排序?

原文:

在实际开发中,常需对多维数组进行“按字段分组 + 去重 + 排序”的组合处理。例如,给定一组记录 [['id' => 1, 'year' => 1999], ['id' => 1, 'year' => 2022], ...],目标是按 year 合并所有对应 id,并对每个年份下的 id 去重后升序排列(注意:原始数据中同一 year 可能含重复 id,但结果中应唯一)。

虽然示例答案中未显式去重,但根据预期输出 "2020" : "1", "2"(而非 "1", "1", "2"),去重是隐含需求。因此,我们优化原逻辑,在添加 ID 前使用 in_array() 判断是否已存在,或更高效地采用 array_unique() 在分组后统一去重。

以下是完整、健壮的实现:

<?php function groupItemsByIdYear($input) { $groupedByYear = []; // 第一步:按 year 分组,收集所有 id(含潜在重复) foreach ($input as $item) { $year = (int)$item['year']; // 强制转为整型,避免字符串年份导致排序异常 $id = (int)$item['id']; if (!isset($groupedByYear[$year])) { $groupedByYear[$year] = []; } $groupedByYear[$year][] = $id; } // 第二步:对每个年份下的 id 数组去重 + 升序排序 foreach ($groupedByYear as $year => &$ids) { $ids = array_values(array_unique($ids)); // 去重并重置索引 sort($ids, SORT_NUMERIC); // 数值升序排序 } // 第三步:按键(year)降序排列,使结果按年份从新到旧展示(可选,符合常见阅读习惯) krsort($groupedByYear); return $groupedByYear; } // 示例数据 $items = [ ['id' => 1, 'year' => 1999], ['id' => 1, 'year' => 2022], ['id' => 2, 'year' => 2020], ['id' => 1, 'year' => 2020], ['id' => 2, 'year' => 2020], // 重复 id+year,验证去重效果 ]; $result = groupItemsByIdYear($items); print_r($result); ?>

输出示例:

立即学习“PHP免费学习笔记(深入)”;

Array ( [2022] => Array ( [0] => 1 ) [2020] => Array ( [0] => 1 [1] => 2 ) [1999] => Array ( [0] => 1 ) )

关键要点说明:

  • 使用 (int) 强制类型转换,避免 '2020'(字符串)与 2020(整数)被视为不同键;
  • array_unique() 确保每个年份下 ID 无重复,sort(..., SORT_NUMERIC) 保证数值正确排序(而非字典序);
  • krsort() 按年份降序排列结果,便于直观查看最新年份优先(如需升序,改用 ksort());
  • array_values() 重置数组索引,确保返回标准数字索引数组,兼容 JSON 序列化等场景。

此方案简洁、可读性强,不依赖高阶函数,兼容 PHP 5.6+,适用于数据量适中的业务场景。若需处理海量数据,建议结合数据库 GROUP BY year, id 与 DISTINCT 提前聚合。

标签:PHP