PHP使用foreach比较两个多维数组

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中的不匹配值,我的主数组和$userSessions,我的内部数组…其中的所有内容都应该在$allSessions中,但结构不同,我的方法是在foreach循环中使用foreach

除了$userSession仅包含一个项目外,这在大多数情况下都有效

我想知道这个bug是不是由循环中的这个循环引起的?当$userSessions仅包含1项而出现错误时,返回的$unregistered数组包含每个项的倍数

    $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);
}