我的项目中嵌套的foreach遇到了很大的问题,我不知道如何正确解决它。
我有以下情况:
用户可以通过某种形式添加或删除会话以及其他类型的数据。我想检查用户是否编辑了会话,如果用户没有在会话中编辑任何数据,那么我就不需要检查其他内容并不需要在数据库中编辑数据。
创建新客户时,它创建了他的会话,例如:
date= "2018-12-12"
startTime= "13:00"
endTime= "14:00"
一个客户一周可以进行多个会话。
然后我有了客户资料,可以在其中编辑一些数据,还可以编辑他的会话,例如日期,开始时间和结束时间,添加更多会话或删除它们。 关键是,当我进入后端时,我得到了创建他时存储的每周会话:
array:2 [▼
1 => array:3 [▼
"weekDay" => "3" //Wednesday
"startTime" => "14:00:00"
"endTime" => "15:00:00"
]
0 => array:3 [▼
"weekDay" => "2" //Tuesday
"startTime" => "14:00:00"
"endTime" => "15:00:00"
]
]
以及来自表单的会话:
array:2 [▼
1 => array:3 [▼
"weekDay" => "3"
"startTime" => "14:00:00"
"endTime" => "15:00:00"
]
0 => array:3 [▼
"weekDay" => "2"
"startTime" => "14:00:00"
"endTime" => "15:00:00"
]
]
在这种情况下,我没有编辑会话,只有其他数据。发生这种情况时,我有以下foreach检查数据是否已更改:
foreach($periodWeek as $periodDay) {
foreach($weekDays as $weekDay) {
if ($weekDay['weekDay'] == $periodDay['weekDay'] &&
$weekDay['startTime'] == $periodDay['startTime'] &&
$weekDay['endTime'] == $periodDay['endTime'])
{
break;
}
} else {
$sessions[] = $weekDay;
}
}
}
$ periodWeek是存储在数据库中的会话,而$ weekDays是来自表单的会话。
我期望得到一个空数组,因为“一切”都是相等的。我知道我这样做是犯了一个愚蠢的错误,因为当foreach循环通过它时,它会得到如下结果:
1和2相等,然后它从循环中断开,这就是我到目前为止想要的。 然后它跳到图像中的第5行。那就是我向内爆的地方,因为我不知道该怎么做,因为5和6不相等,即使7和8也不相等。然后我得到以下结果:
array:1 [▼
0 => array:3 [▼
"weekDay" => "2"
"startTime" => "14:00:00"
"endTime" => "15:00:00"
]
这正是我告诉代码要执行的操作,但这不是我所期望的,它只应在编辑客户会话时才具有这种行为。
我不知道如何解决这个笨拙的逻辑,我尝试弹出并移动数组,但是没有正常工作。我迷失了自己,陷入了这个问题好几个星期了……如果有人可以帮助我,我会很高兴的。
谢谢。
编辑:忘记了每周或存储的日期可能有不同的大小,例如我可能每周在数据库中存储3天,但我只发送了1天(已删除2天其中的)。
答案 0 :(得分:0)
如果我正确理解了您的问题,听起来您只是想做:
foreach($periodWeek as $periodDay) {
$foundMatch = false;
foreach($weekDays as $weekDay) {
if ($weekDay['weekDay'] == $periodDay['weekDay'] &&
$weekDay['startTime'] == $periodDay['startTime'] &&
$weekDay['endTime'] == $periodDay['endTime'])
{
$foundMatch = true;
break;
}
}
if (!$foundMatch) {
$sessions[] = $weekDay;
}
}
也可以代替
if ($weekDay['weekDay'] == $periodDay['weekDay'] &&
$weekDay['startTime'] == $periodDay['startTime'] &&
$weekDay['endTime'] == $periodDay['endTime'])
您可以这样做:
if ($weekDay == $periodDay)
http://php.net/manual/en/language.operators.array.php:
$ a == $ b相等如果$ a和$ b具有相同的键/值对,则为TRUE。
或者,我能想到的最短版本:
foreach($periodWeek as $periodDay) {
foreach($weekDays as $weekDay) {
if ($weekDay == $periodDay) continue 2;
}
$sessions[] = $weekDay;
}