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

从双数组填充的下拉框获取排班表单值失败问题排查

问题分析与解决方案

你遇到的核心问题是表单元素的命名方式不对,导致提交后无法获取到完整的值班数据。现在你的所有<select>标签的name都是rostered,当表单提交时,同名的表单元素值会被最后一个覆盖,自然拿不到所有的值班信息。

修复步骤:

  1. 修改表单元素的name属性为数组格式
    要按周数和团队来区分每个选择框,把name="rostered"改成name="roster[<?php echo $wknumber; ?>][<?php echo $i; ?>]"。这样提交后,你就能在save.php里通过$_POST['roster']拿到一个二维数组,键是周数和团队名,值是选中的员工ID。

  2. 回显已有的值班数据(添加selected属性)
    你的现有代码没有根据$roster数组设置选中状态,编辑页面没法显示已有的值班安排。需要在循环生成<option>的时候,判断当前员工ID是否在对应周的值班列表里,如果是就加上selected属性。

修改后的核心代码片段:

foreach (range(0, 52) as $wknumber) {
    echo "<tr>";
    echo "<td>";
    echo "week ".$wknumber;
    echo "</td>";
    foreach ($uniqueteams as $team) {
        // 先找到当前周对应的值班ID列表
        $currentRosterIds = [];
        foreach ($roster as $r) {
            // 假设$roster里的第一个元素是日期范围,后面的是ID
            if (strpos($r[0], "week ".$wknumber) !== false) {
                $currentRosterIds = array_slice($r, 1);
                break;
            }
        }

        echo "<td><div><select name=\"roster[{$wknumber}][{$team}]\">".PHP_EOL;
        foreach ($staff as $row){
            if ($row['Team']==$team){
                // 判断当前员工ID是否在值班列表里,设置selected
                $selected = in_array($row['ID'], $currentRosterIds) ? 'selected' : '';
                echo '<option value="'.$row['ID'].'" '.$selected.'>'.$row['Name'].'</option>'.PHP_EOL;
            }
        }
        echo "</select></div></td>".PHP_EOL;
    }
    echo "</tr>"; // 别忘了闭合<tr>标签,你原来的代码漏了这个!
}

补充说明:

  • 你原来的代码在foreach (range(0, 52) as $wknumber)循环里没有闭合<tr>标签,这会导致HTML结构错误,也可能影响表单提交,一定要加上echo "</tr>";。
  • 在save.php里,你可以通过print_r($_POST['roster'])来查看提交后的完整数据,然后再按照你的需求处理(比如写入CSV)。

内容的提问来源于stack exchange,提问作者Daz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:42:39