PHP使用foreach比较两个多维数组
我试图比较两个多维数组$allSessions中的不匹配值,我的主数组和$userSessions,我的内部数组…其中的所有内容都应该在$allSessions中,但结构不同,我的方法是在foreach循环中使用foreach 除了$userSession仅包含一个项目外,这在大多数情况下都有效 我想知道这个bug是不是由循环中的这个循环引起的?当$userSessions仅包含1项而出现错误时,返回的$unregistered数组包含每个项的倍数PHP使用foreach比较两个多维数组,php,arrays,multidimensional-array,foreach,array-difference,Php,Arrays,Multidimensional Array,Foreach,Array Difference,我试图比较两个多维数组$allSessions中的不匹配值,我的主数组和$userSessions,我的内部数组…其中的所有内容都应该在$allSessions中,但结构不同,我的方法是在foreach循环中使用foreach 除了$userSession仅包含一个项目外,这在大多数情况下都有效 我想知道这个bug是不是由循环中的这个循环引起的?当$userSessions仅包含1项而出现错误时,返回的$unregistered数组包含每个项的倍数 $allSessions = $thi
$allSessions = $this->getAllUpcoming();
$unregistered = array();
$userSessions = $this->getUserSessions($userID);
foreach ($allSessions as $session) {
foreach ($userSessions as $user) {
if ($user["entry_data"]["session-participant-session"]["id"] !== $session["id"]){
array_push($unregistered, $session);
}
}
}
按照您拥有它的方式,您将获得所有不匹配的元素 假设$allSessions中的a、b、c与$userSessions中的a、b、c完全匹配。在你的第一个外环中,你有一个“a”。在内部循环中,您将向$unregistered添加“b”和“c”,因为它们不匹配。然后在外循环中转到“b”,在内循环中添加“a”和“c”的另一个副本。等等 我很高兴你会有不同的结构。您必须检查$userSessions中的每个元素,只有在未找到任何匹配项的情况下才能转到$allSessions中的下一个元素:
foreach ($allSessions as $session) {
foreach ($userSessions as $user) {
if ($user["entry_data"]["session-participant-session"]["id"] === $session["id"])
continue 2; // this goes to the next element in $allSessions
}
array_push($unregistered, $session);
}
如果您不熟悉continue,请使用可读性稍高的表单:
foreach只需要一个数组。它不在乎是否有0、1或数百万个项目。它只会迭代其中的任何内容。带有一个项目的$userSessions是什么样子的?当您在$userSessions中有多个项目时,它确实工作吗?在我看来,对于$allSessions中的每个元素,您将在$userSessions中获得所有不匹配的元素。啊,我明白了。我希望我的$unregistered数组是allSessions中与$userSessions中的元素不匹配的任何元素。我会试着继续。谢谢。不幸的是,事实并非如此。我现在有一个混乱的解决方案,我希望重构。当我有了它时,我会计划用它来更新。我又看了一眼,意识到我在嵌套的大括号中的错误位置使用了array_push调用。它需要在内环之后,而不是在内环之前。你现在可以再试一次。
foreach ($allSessions as $session) {
$found = false;
foreach ($userSessions as $user) {
if ($user["entry_data"]["session-participant-session"]["id"] === $session["id"]) {
$found = true;
break; // an optimization - not strictly necessary
}
}
if (!$found)
array_push($unregistered, $session);
}