PHP foreach与mysqli关联数组问题:日期选项重复显示
问题解决:下拉框日期重复显示的修复
问题根源
你的代码里,外层循环每生成一个日期,内层都会遍历所有封禁星期数组元素,每个日期会被输出N次(N等于封禁星期的数量),比如封禁了周日和周一,每个日期都会输出2次,导致所有选项重复。
修复思路
- 先把数据库返回的封禁星期整理成一个独立数组,方便后续判断
- 对每个生成的日期,仅判断一次是否属于封禁星期,每个日期只输出一个
<option>标签
修改后的完整代码
1. 优化数据获取逻辑
先提取封禁星期的全称到数组,避免后续重复处理:
$sqlClosedDays = "SELECT Day FROM check_availability WHERE Blocked = '1'"; $resultClosed = mysqli_query($con, $sqlClosedDays); // 提取所有封禁星期到数组,比如 ['Sunday', 'Monday'] $closedWeekDays = []; while ($row = mysqli_fetch_assoc($resultClosed)) { $closedWeekDays[] = $row['Day']; }
2. 重构下拉框生成循环
每个日期仅输出一次,根据是否在封禁数组中决定是否禁用:
echo "<select name='add_r_date' id='add_r_date'>"; for ($i = 0; $i <= 60; $i++) { $currentDate = strtotime("+$i day"); $dayText = date('l,d M', $currentDate); $insDay = date('Y-m-d', $currentDate); // 获取当前日期的星期全称(比如Sunday) $currentWeekDay = date('l', $currentDate); // 判断是否是封禁日期 if (in_array($currentWeekDay, $closedWeekDays)) { echo "<option disabled value='$insDay'>$dayText</option>"; } else { echo "<option value='$insDay'>$dayText</option>"; } } echo "</select>";
关键优化点
- 用
in_array()替代内层foreach循环,直接判断当前日期的星期是否在封禁列表中 - 每个日期仅生成一个
<option>,彻底解决重复问题 - 提取封禁星期数组时,使用
mysqli_fetch_assoc()循环获取,比mysqli_fetch_all()更节省内存(可选优化) - 复用
strtotime()的结果,避免重复计算时间戳
内容的提问来源于stack exchange,提问作者Demetris Demetriou
相关产品推荐
相关产品推荐

