php筛选及格成绩应优先用array_filter()配回调函数判断$score>=60,保留原键名;数字索引需array_values()重排;含脏数据时先校验有效性再比较,及格线建议配置化。

PHP 数组筛选成绩及格项,核心就是用 array_filter() 配合自定义回调函数,判断是否 ≥60(或按实际及格线调整)。别硬写 foreach 循环手动推新数组——既啰嗦又容易漏键名。
用 array_filter() 直接筛出及格分数
这是最自然、语义最清晰的做法。默认保留“真值”,所以回调里直接返回 $score >= 60 即可:
$scores = ['张三' => 85, '李四' => 52, '王五' => 76, '赵六' => 49];
$passing = array_filter($scores, function($score) {
return $score >= 60;
});
// 结果:['张三' => 85, '王五' => 76]
- 键名会原样保留,适合带学生姓名的关联数组
- 如果原始数组是数字索引(如
[85, 52, 76]),结果索引会“不连续”,需要后续用array_values()重排(除非你本来就要保持原索引) - 注意:
array_filter()对0、false、''等也会过滤——但成绩通常是非负整数,只要没存0表示缺考,就没事;若存在0成绩且要保留,必须显式写return $score >= 60;,不能依赖隐式布尔转换
筛选同时映射成新结构(比如只取姓名)
如果只要及格学生的姓名列表,而不是成绩本身,用 array_keys() 配合 array_filter() 最省事:
$passingNames = array_keys(array_filter($scores, fn($s) => $s >= 60)); // 结果:['张三', '王五']
- 避免先
array_filter()再foreach提键名,多一层循环 - PHP 7.4+ 支持箭头函数
fn(),写法更紧凑;老版本请用完整function($s) { return $s >= 60; } - 如果还要带上成绩,直接
array_filter()后再array_map()或foreach构造新格式,别试图一步到位
处理含空值、字符串数字、缺考标记的脏数据
真实成绩单常有 null、'—'、'缺考'、'0'(真零分)或字符串 '78'。这时不能裸用 intval() 或强制转换:
立即学习“PHP免费学习笔记(深入)”;
- 用
is_numeric($score) && (int)$score >= 60判断有效数字且及格 - 对明确标记的缺考值(如
'absent'),先用in_array($score, ['—', '缺考', 'absent'], true)排除,再判分 - 字符串数字(如
'85')可直接和整数比较(PHP 会自动转),但为防意外,建议统一用(float)$score >= 60.0,兼容小数成绩 - 别用
empty()判空——0会被当成空,误删及格的零分(虽然少见)
及格线未必总是 60,也未必所有科目统一;筛选逻辑一旦嵌进业务(比如体育及格线是 50),最好抽成配置变量或常量,别硬编码在回调里。还有,array_filter() 不修改原数组,这点很安全——但如果你忘了赋值给新变量,就会发现怎么筛都没反应。











