php数组如何筛选成绩及格项_php成绩数组筛选技巧【技巧】

1次阅读

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

php数组如何筛选成绩及格项_php成绩数组筛选技巧【技巧】

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()0false'' 等也会过滤——但成绩通常是非负整数,只要没存 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() 不修改原数组,这点很安全——但如果你忘了赋值给新变量,就会发现怎么筛都没反应。

text=ZqhQzanResources