我将问一个关于我遇到的问题的问题,并根据你们这些人的意见来解决这个问题。如果我真的无法得到它,我会发布源代码,但在这里我去...
所以,我有一个表格,它垂直显示字段。一切都是下拉菜单,最后是提交按钮。有一些javascript允许我添加一个没有页面刷新的新行。因此,每个键的$ _POST数组数量永远不会相同。我担心的关键(好吧所有这些,但是一旦我开始工作,它将适用于所有这些)是$_POST['monworkhours']
下拉。这是一个包含不同工作时间列表的下拉列表。我认为问题在于我需要根据提交循环遍历所有$_POST['monworkhours']
数组。 我不知道该怎么做。
此外,“问题”导致每行输出产生相同的结果。所以无论我为第一个字段设置什么,最终都是我通过javascript函数“添加”的每一个额外行的结果。
感谢任何帮助。
表格:
<select name="monshifthours[]" id="monshifthours">
<option value="OFF">OFF</option>
<optgroup label="Front/Back Half">
<option value="7am7pm">7AM-7PM</option>
<option value="7pm7am">7PM-7AM</option>
<option value="7am7pmalt">7AM-7PM (Alt)</option>
<option value="7pm7amalt">7PM-7AM (Alt)</option>
</optgroup>
<optgroup label="Monday - Friday">
<option value="630am330pm">630AM-330PM</option>
<option value="7am4pm">7AM-4PM</option>
<option value="8am5pm">8AM-5PM</option>
<option value="10am7pm">10AM-7PM</option>
</optgroup>
</select>
$ _POST输出(2个表单行):
["monshifthours"]=>
array(2) {
[0]=>
string(6) "7am7pm"
[1]=>
string(6) "7pm7am"
}
截图:
getCellColor()函数:
function getCellColor($dow) {
foreach($_POST[$dow . 'shifthours'] as $key=> $hour) {
echo $count;
if ($hour == "7am7pmalt") {
return "style=\"background: yellow; color:#000;\"";
}
elseif ($hour == "OFF") {
return "style=\"background: red; color:#fff;\"";
}
else {
return "style=\"background: green; color:#fff;\"";
}
}
}
提交输出:
if (isset($_POST['submit'])) {
echo preTableFrmt();
foreach($engineer as $a => $b) {
echo "| [[$engineer[$a]]] || ".getCellColor('mon')." | $monday[$a] || ".getCellColor('tues')." | $tuesday[$a] || ".getCellColor('wed')." | $wednesday[$a] || ".getCellColor('thur')." | $thursday[$a] || ".getCellColor('fri')." | $friday[$a] || ".getCellColor('sat')." | $saturday[$a] || ".getCellColor('sun')." | $sunday[$a] <br />|-<br />";
}
echo postTableFrmt();
}
else { echo "Waiting for data..."; }
注意:提交表格的一行时,一切都很好;这是我不止一个人的时候;然后我得到重复的信息。
以下示例应该向您展示当我“添加工程师”时会发生什么(现在将其设为两个表格行)。我将在图像后发布输出:
应用图片:
注意:不要注意时间的输出,因为它们是通过一些正则表达式动态格式化的,有些是有效的,有些则不然,因为我必须完成这些功能的编写。请注意我发送的以下输出在第一部分是正确的,但第二部分是第一行输出的副本:
|-
| [[Drew Decker]] || style="background: yellow; color:#000;" | 7am7pmalt || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || | || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF
|-
| [[Drew Decker]] || style="background: yellow; color:#000;" | 7pm-7am || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || | || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF
注意:重复项在style="background: yellow; color:#000;"
。
我的整体解决方案
所以,我最终找到了一个不需要我更改表单代码的解决方案。我不相信我需要更改我的表单代码,因为它是动态的。通常,如果我将其写入数据库并将多行表单数据提交到数据库,我可以看到这一点很重要,但是,在这种情况下,我不认为这是正确的解决方案。但是,我感谢并感谢我收到的所有深思熟虑和信息化的答案。
我最终将getCellColor()
功能更改为以下内容:
function getCellColor($index,$dow) {
if ( isset($_POST[$dow . 'shifthours'][$index]) && ($_POST[$dow . 'shifthours'][$index] == "7am7pmalt" || $_POST[$dow . 'shifthours'][$index] == "7pm7amalt")) {
return "style=\"background: yellow; color:#000;\"";
}
elseif ($_POST[$dow . 'shifthours'][$index] == "OFF") {
return "style=\"background: red; color:#fff;\"";
}
else {
return "style=\"background: green; color:#fff;\"";
}
}
我的foreach
现在看起来像:
foreach($engineer as $a => $b) {
echo "|-<br />| [[$engineer[$a]]] || ".getCellColor($a,"mon")." | ".format_date($monday[$a])." || ".getCellColor($a,"tues")." | ".format_date($tuesday[$a])." || ".getCellColor($a,"wed")." | ".format_date($wednesday[$a])." || ".getCellColor($a,"thur")." | ".format_date($thursday[$a])." || ".getCellColor($a,"fri")." | ".format_date($friday[$a])." || ".getCellColor($a,"sat")." | ".format_date($saturday[$a])." || ".getCellColor($a,"sun")." | ".format_date($sunday[$a])."<br />";
}
这样做可以确保我只是告诉它选择正确的数组索引,并相应地继续。
答案 0 :(得分:1)
下面的解决方案适用于具有相同名称的复选框列表。我相信它也适用于下拉菜单列表,正如我在下面写的那样,但我还没有测试过。
<select name="monworkhours[]">
<option value="aaa">aaa</option>
<option value="bbb">bbb</option>
<option value="ccc">ccc</option>
</select>
<select name="monworkhours[]">
<option value="ddd">ddd</option>
<option value="eee">eee</option>
<option value="fff">fff</option>
</select>
提交此表单后,$ _POST ['monworkhours']有望成为一个数组。我没有测试过,但我不知道为什么这不起作用。
答案 1 :(得分:1)
循环通过$ _POST ['monworkhours']是微不足道的:
foreach ($_POST['monworkhours'] as $i => $value){
// Do something
}
没有看到更多代码,我不能说你的问题是什么。您是在HTML中选择值(例如<option value="7am7pm" selected>7AM-7PM</option>
),还是使用javascript?
如果是javascript,则可能与您对多个元素使用相同ID的事实有关。这在技术上是不正确的。您可以使用按顺序编号的ID,如下所示:
<select name="monshifthours_0" id="monshifthours_0">
...
<select name="monshifthours_1" id="monshifthours_1">
然后在PHP中迭代它们,就像这样:
$i = 0;
while (isset($_POST["monshifthours_$i"])){
// Do something
$i++;
}
如果这些都没有帮助,请发布更多代码。更多。
答案 2 :(得分:1)
我想我现在明白你的问题。您的问题是,一旦您提交表单,此代码就会运行:
foreach($engineer as $a => $b) {
echo "| [[$engineer[$a]]] || ".getCellColor('mon')." | ...";
}
因此,换句话说,对于每个工程师,您运行函数getCellColor();
现在,函数getCellColor()也会执行一个完整的循环并评估发布的所有项目,因此返回最后一个表单行的结果。
function getCellColor($dow) {
foreach($_POST[$dow . 'shifthours'] as $key=> $hour) {
...
}
}
所以,换句话说,这是正在发生的事情:
注意:你说输出的第一行是正确的,但实际上它不是。每一行都输出最后一行的结果。
作为一个建议,我会在他的回答中提到像Patrick Fisher这样的东西。
<select name="aa_1"> <select name="bb_1"> <input type="hidden" name="lines[]" value="1" />
<select name="aa_2"> <select name="bb_2"> <input type="hidden" name="lines[]" value="2" />
<select name="aa_3"> <select name="bb_3"> <input type="hidden" name="lines[]" value="3" />
这样,提交表单后,您可以单独水平(即逐行)获取每个表单元素,而不是垂直。
foreach($_POST["lines"] as $key => $value) {
${"aa_".$value} = $_POST["aa_".$value];
${"bb_".$value} = $_POST["bb_".$value];
}
答案 3 :(得分:1)
所以,我最终找到了一个不需要我更改表单代码的解决方案。我不相信我需要更改我的表单代码,因为它是动态的。通常,如果我将其写入数据库并将多行表单数据提交到数据库,我可以看到这一点很重要,但是,在这种情况下,我不认为这是正确的解决方案。但是,我感谢并感谢我收到的所有深思熟虑和信息化的答案。
我最终将getCellColor()
功能更改为以下内容:
function getCellColor($index,$dow) {
if ( isset($_POST[$dow . 'shifthours'][$index]) && ($_POST[$dow . 'shifthours'][$index] == "7am7pmalt" || $_POST[$dow . 'shifthours'][$index] == "7pm7amalt")) {
return "style=\"background: yellow; color:#000;\"";
}
elseif ($_POST[$dow . 'shifthours'][$index] == "OFF") {
return "style=\"background: red; color:#fff;\"";
}
else {
return "style=\"background: green; color:#fff;\"";
}
}
我的foreach
现在看起来像:
foreach($engineer as $a => $b) {
echo "|-<br />| [[$engineer[$a]]] || ".getCellColor($a,"mon")." | ".format_date($monday[$a])." || ".getCellColor($a,"tues")." | ".format_date($tuesday[$a])." || ".getCellColor($a,"wed")." | ".format_date($wednesday[$a])." || ".getCellColor($a,"thur")." | ".format_date($thursday[$a])." || ".getCellColor($a,"fri")." | ".format_date($friday[$a])." || ".getCellColor($a,"sat")." | ".format_date($saturday[$a])." || ".getCellColor($a,"sun")." | ".format_date($sunday[$a])."<br />";
}
这样做可以确保我只是告诉它选择正确的数组索引,并相应地继续。