
本文详解如何在 PHP 中将多个含重复 student_id 的二维学生成绩数组合并为一个去重后的统一数组,优先保留原始数据,并按需合并或覆盖字段(如 totals、remarks),适用于多场考试成绩汇总场景。
在实际教学管理系统中,常需将不同考试(如期中、期末、补考)的成绩数组合并为一份完整的学生总表。这些数组结构一致(含 student_id、stname、remarks、totals 等键),但存在跨数组的相同 student_id —— 即同一学生有多条记录,需去重并合理聚合(例如:remarks 标记为“1”表示已参与某考试;totals 可能需保留首次值、取最大值或累加,依业务而定)。
⚠️ 注意:原始答案中的代码存在明显错误($old_array['student_id'] 应为 $value['student_id'],且未处理键冲突逻辑),以下提供健壮、可扩展、符合生产规范的实现方案。
✅ 正确做法:以 student_id 为键归并,支持字段级合并策略
'1190101', 'stname' => 'Student 1', 'remarks' => '', 'totals' => 21],
['student_id' => '1190102', 'stname' => 'Student 2', 'remarks' => '1', 'totals' => 6],
['student_id' => '1190104', 'stname' => 'Student 4', 'remarks' => '1', 'totals' => 6],
];
$array2 = [
['student_id' => '1190104', 'stname' => 'Student 4', 'remarks' => '', 'totals' => 5],
['student_id' => '1190105', 'stname' => 'Student 5', 'remarks' => '', 'totals' => 5],
];
$array3 = [
['student_id' => '1190106', 'stname' => 'Student 6', 'remarks' => '', 'totals' => 5],
['student_id' => '1190107', 'stname' => 'Student 7', 'remarks' => '', 'totals' => 5],
];
// 合并所有数组
$allArrays = [$array1, $array2, $array3];
$result = [];
foreach ($allArrays as $arr) {
foreach ($arr as $record) {
$id = $record['student_id'];
// 首次出现:直接初始化
if (!isset($result[$id])) {
$result[$id] = $record;
} else {
// 已存在 → 按字段策略合并(关键!)
// ✅ remarks:只要任一数组标记为 '1',即设为 '1'(表示该生至少参加过一次)
if (empty($result[$id]['remarks']) && !empty($record['remarks'])) {
$result[$id]['remarks'] = $record['remarks'];
}
// ✅ totals:此处按「保留原始值(来自 $array1)」+「后续仅作参考不覆盖」逻辑
// 若需覆盖(如取最新考试分数),改为:$result[$id]['totals'] = $record['totals'];
// 若需累加:$result[$id]['totals'] += $record['totals'];
// 若需取最大值:$result[$id]['totals'] = max($result[$id]['totals'], $record['totals']);
}
}
}
// 转为索引数字数组(保持原始顺序或按 student_id 排序)
$merged = array_values($result);
// 可选:按 student_id 升序排列
usort($merged, fn($a, $b) => strcmp($a['student_id'], $b['student_id']));
print_r($merged);
?>? 关键设计说明
- 去重核心:使用 student_id 作为关联数组键,天然避免重复;
-
字段合并策略灵活:
- stname:通常恒定,首次出现即锁定(可加校验确保一致性);
- remarks:布尔语义(空/非空),采用“或逻辑”(有 1 则为 1);
- totals:根据业务选择策略(保留首值、覆盖、累加、取最大等);
-
健壮性增强:
- 显式检查 isset() 避免未定义索引警告;
- 支持任意数量输入数组(传入 $allArrays 即可);
- 输出为标准索引数组(array_values()),便于遍历和 JSON 输出。
⚠️ 注意事项
- 务必确保所有输入数组中 student_id 类型一致(全为字符串或全为整数),否则 '1190101' !== 1190101 会导致重复;
- 若 stname 在不同数组中不一致(如拼写错误),需增加校验逻辑或抛出异常;
- 大数据量时(>10,000 条),建议使用 SplFixedArray 或数据库临时表提升性能;
- 如需保留各来源数组的元信息(如 exam_type => 'midterm'),可在合并时追加字段。
通过以上方法,你不仅能准确生成单维去重数组,更能根据真实业务需求精准控制每个字段的合并行为,真正实现“一个学生,一份权威档案”。
立即学习“PHP免费学习笔记(深入)”;











