You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP foreach与mysqli关联数组问题:日期选项重复显示

问题解决:下拉框日期重复显示的修复

问题根源

你的代码里,外层循环每生成一个日期,内层都会遍历所有封禁星期数组元素,每个日期会被输出N次(N等于封禁星期的数量),比如封禁了周日和周一,每个日期都会输出2次,导致所有选项重复。

修复思路

  1. 先把数据库返回的封禁星期整理成一个独立数组,方便后续判断
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:02:43