“的foreach +如果”只适用于最后一个元素
问题描述:
我有一个复选框,一个PHP页面来处理数据的形式。我检查我的数据:一切正常。
要管理复选框,我会根据表单中选中的复选框执行一个“FOREACH”,其中包含指令和sql查询的几个“IF”循环。
我尝试在我的数组上循环输入适合用户检查的每个框的循环“IF”。
问题:
当我运行该脚本,我检查3或5盒,只有最后一个循环“IF”是考虑到... :(
我检查了侧HTML表单和PHP测试POST:一切正常
所以我的问题是:
哪儿了我搞砸了,这样在foreach只能通过T的最后一个元素他排列在“IF”循环?
下面的代码:
if (isset($_POST['ModalMultipleColorEdit']) && !empty($_POST['Planning_ID2']) && !empty($_POST['CaseColor2']) && !empty($_POST['CaseWeek2']))
{
//------- Extract Needed Posted Data
$TargetID = $_POST['Planning_ID2'];
$TargetColor = $_POST['CaseColor2'];
$TargetMonth = $_POST['CaseMonth2'];
//----- GET OLD DATA
$REQ = $DB->query("SELECT * FROM `Planning` WHERE `ID_Planning` = ".$TargetID." ;")
or die(var_dump($REQ->errorInfo()));
$DATA = $REQ->fetch();
// Explore Targeted Weeks Array
foreach($_POST['CaseWeek2'] as $CheckedWeek)
{
//----------- IF TARGET MONTH IS JANUARY
if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-1)")
{
//------- Extract Color String Period
$GetColor = explode("." , $DATA['Planning_M1']);
//------- Change Period Color
$GetColor[0] = $TargetColor;
//------- Build New Color String
$NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4];
// ------ UPDATE REQUEST
$REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
$REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo()));
$REQ2 = NULL;
}
if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-2)")
{
//------- Extract Color String Period
$GetColor = explode("." , $DATA['Planning_M1']);
//------- Change Period Color
$GetColor[1] = $TargetColor;
//------- Build New Color String
$NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4];
// ------ UPDATE REQUEST
$REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
$REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo()));
$REQ2 = NULL;
}
if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-3)")
{
//------- Extract Color String Period
$GetColor = explode("." , $DATA['Planning_M1']);
//------- Change Period Color
$GetColor[2] = $TargetColor;
//------- Build New Color String
$NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4];
// ------ UPDATE REQUEST
$REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
$REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo()));
$REQ2 = NULL;
}
if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-4)")
{
//------- Extract Color String Period
$GetColor = explode("." , $DATA['Planning_M1']);
//------- Change Period Color
$GetColor[3] = $TargetColor;
//------- Build New Color String
$NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4];
// ------ UPDATE REQUEST
$REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
$REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo()));
$REQ2 = NULL;
}
if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-5)")
{
//------- Extract Color String Period
$GetColor = explode("." , $DATA['Planning_M1']);
//------- Change Period Color
$GetColor[4] = $TargetColor;
//------- Build New Color String
$NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4];
// ------ UPDATE REQUEST
$REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
$REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo()));
$REQ2 = NULL;
}
}
//------- REDIRECT WHEN SUCCESS AND NO MORE TARGETS
header('Location: PlanningNow.php?Process=Success');
exit();
}
else
{
header('Location: PlanningNow.php?Process=ErrorForm');
exit();
}
预先感谢您的帮助! :)
答
我不得不组成一些数据进行测试。考虑这个方法,以减少查询调用一个,并在很大程度上巩固你的代码...
代码:(Demo)
$_POST['CaseWeek2']=['(S-2)','(S-3)','(S-5)']; // target checkboxes
$_POST['CaseColor2']='purple'; // target color
$_POST['CaseMonth2']='Janvier'; // target month
$checkedWeeks=['(S-1)','(S-2)','(S-3)','(S-4)','(S-5)']; // possible checkboxes
$DATA['Planning_M1']='red.orange.yellow.green.blue'; // old data from db
$oldcolors=explode('.',$DATA['Planning_M1']);
if($_POST['CaseMonth2']=='Janvier'){
// var_export(array_intersect($checkedWeeks,$_POST['CaseWeek2']));
$keys=array_keys(array_intersect($checkedWeeks,$_POST['CaseWeek2'])); // get appropriate keys
// var_export($keys);
$values=array_fill(0,sizeof($keys),$_POST['CaseColor2']); // generate equal number of values
// var_export($values);
$replacements=array_combine($keys,$values); // combine keys and values to make correct array
// var_export($replacements);
$newcolors=array_replace($oldcolors,$replacements); // replace old values with new values
var_export($newcolors);
//$REQ2=$DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');
//$REQ2->execute(array(implode('.',$newcolors), $TargetID));
}
输出:
array (
0 => 'red',
1 => 'purple',
2 => 'purple',
3 => 'green',
4 => 'purple',
)
哦,对了记录,之前迭代被“忽略”的原因是因为:
$GetColor = explode("." , $DATA['Planning_M1']);
每次调用UPDATE时,都会有效地拉动旧缓存的数据,交换单一颜色,并覆盖较早的迭代的UPDATE。
如果你想保持你的代码几乎相同,你可以写:
$GetColor = explode("." , $DATA['Planning_M1']);
的foreach()
循环之前,则有条件地修改$GetColor
你正在与$GetColor[n]
做。然后在循环结束后,您可以使用完全修改的$GetColor
数据对数据库进行单个UPDATE调用。
+0
哦,是的!你是对的,现在我明白了,它的工作就像魅力!非常感谢 ! ;) –
看起来像你的逻辑问题。你得到最后一个元素更新,因为每次在循环中,你的先前值将被更新为最新值,所以最后你会得到最后更新的值 –
这就是我的想法......但我无法弄清楚如何解决它?有什么建议么 ? –
什么是自动递增的数组? – DarkBee