PHP数组取值与单值判断:下拉框分数计算及区间判断问题
问题场景与需求
我有3个取值范围为0到25的下拉选择框,HTML代码如下:
<select class="form-select" id="select1" name="select1"> <option selected value="0">label...</option> <option value="5">label...</option> <option value="10">label...</option> <option value="15">label...</option> <option value="20">label...</option> <option value="25">label...</option> </select> <select class="form-select" id="select2" name="select2"> <option selected value="0">label...</option> <option value="5">label...</option> <option value="10">label...</option> <option value="15">label...</option> <option value="20">label...</option> <option value="25">label...</option> </select> <select class="form-select" id="select3" name="select3"> <option selected value="0">label...</option> <option value="5">label...</option> <option value="10">label...</option> <option value="15">label...</option> <option value="20">label...</option> <option value="25">label...</option> </select>
尝试通过$_GET获取三个下拉框的值并计算总分,PHP代码如下:
//get select values $select1= $_GET['select1']; $select2= $_GET['select2']; $select3= $_GET['select3']; $totalValues = array($select1, $select2, $select2); $totalScore = array_sum($totalValues);
需要实现以下条件判断逻辑:
- 判断数组中是否存在值处于5-9区间
- 判断数组中是否存在值处于10-14区间
- 判断数组中是否存在值处于15-19区间
- 判断数组中是否存在值处于20-25区间
尝试用in_array()实现但遇到问题,请问最优实现方案是什么?
最优实现方案
1. 先修正代码错误
首先你定义$totalValues时存在笔误,将$select3写成了$select2,需修正。同时$_GET获取的值为字符串类型,建议转为整数避免判断异常:
// 转整数并修正数组元素 $select1 = (int)$_GET['select1']; $select2 = (int)$_GET['select2']; $select3 = (int)$_GET['select3']; $totalValues = array($select1, $select2, $select3); $totalScore = array_sum($totalValues);
2. 区间判断的两种高效实现
in_array()仅能判断精确值,无法直接处理区间判断,推荐以下两种方案:
方案一:使用array_filter()过滤判断
通过array_filter()筛选符合区间的元素,再判断结果是否非空:
// 判断是否存在5-9区间的值 $has5_9 = !empty(array_filter($totalValues, function($val) { return $val >= 5 && $val <= 9; })); // 判断是否存在10-14区间的值 $has10_14 = !empty(array_filter($totalValues, function($val) { return $val >= 10 && $val <= 14; })); // 判断是否存在15-19区间的值 $has15_19 = !empty(array_filter($totalValues, function($val) { return $val >= 15 && $val <= 19; })); // 判断是否存在20-25区间的值 $has20_25 = !empty(array_filter($totalValues, function($val) { return $val >= 20 && $val <= 25; }));
方案二:单次遍历完成所有判断
如果追求更高效率,可遍历数组一次同时完成所有区间判断,还能提前终止遍历:
$has5_9 = false; $has10_14 = false; $has15_19 = false; $has20_25 = false; foreach ($totalValues as $val) { if ($val >= 5 && $val <= 9) { $has5_9 = true; } elseif ($val >= 10 && $val <= 14) { $has10_14 = true; } elseif ($val >= 15 && $val <= 19) { $has15_19 = true; } elseif ($val >= 20 && $val <= 25) { $has20_25 = true; } // 所有条件满足后提前终止遍历 if ($has5_9 && $has10_14 && $has15_19 && $has20_25) { break; } }
3. 结合总分判断的完整逻辑
如果需要结合$totalScore <= 15的条件设置$rating,可参考以下代码:
$rating = null; if ($totalScore <= 15) { $has5_9 = !empty(array_filter($totalValues, function($val) { return $val >= 5 && $val <= 9; })); if ($has5_9) { $rating = 5; } // 可在此扩展其他区间对应的rating赋值逻辑 }
内容的提问来源于stack exchange,提问作者jmiller
相关产品推荐
相关产品推荐

