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

时间:2015-04-16 18:20:26

标签: php arrays multidimensional-array foreach array-difference

我正在尝试比较两个多维数组($allSessions,我的主数组和$userSessions中的非匹配值,我的内部数组......其中的所有内容都应该在{{1}之内},但结构不同)我的方法是在foreach循环中使用foreach。

除了一个(当$allSessions只包含一个项目时),这在大多数情况下都适用。

我想知道这个bug是否是由循环中的这个循环引起的?当因为$ userSessions只包含1个项目而导致错误时,返回的$userSession数组包含每个项目的倍数......

$unregistered

1 个答案:

答案 0 :(得分:0)

在你拥有它的方式中,你将得到每个不匹配的元素。

假设您与$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 ($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);
}