嵌套的foreach循环意外结果

时间:2018-12-12 20:44:07

标签: php

我的项目中嵌套的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循环通过它时,它会得到如下结果:

The result of the 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天其中的)。

1 个答案:

答案 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;
}