【问题标题】:PHP Comparing two multidimensional arrays with foreachPHP用foreach比较两个多维数组
【发布时间】:2015-04-16 18:20:25
【问题描述】:

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

这在大多数情况下都有效,除了一种情况(当$userSession 只包含一项时)。

我想知道这个错误是否是由循环中的这个循环引起的?当由于 $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);
            }
        }
    }

【问题讨论】:

  • foreach 只需要一个数组。它不关心是否有 0、1 或数以亿计的项目。它只会遍历其中的任何内容。
  • $userSessions 与一个项目看起来像什么?
  • 当您在$userSessions 中拥有超过 1 个项目时,您“确定”它正在工作吗?在我看来,您将在 $userSessions 中为 $allSessions. 中的每个元素获取所有不匹配的元素

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


【解决方案1】:

以你拥有它的方式,你会得到每一个不匹配的元素。

假设您在$allSessions$userSessions 中的a,b,c 和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);
}

【讨论】:

  • 啊,我明白了。我希望我的$unregistered 数组是allSessions 中与$userSessions 中的元素不匹配的任何元素。我会尝试整合continue
  • 谢谢。不幸的是,它没有。我现在有一个混乱的解决方案,我希望能重构。当我有它时,我会计划更新。
  • 我又看了一遍,意识到我在嵌套大括号内的错误位置调用了 array_push()。它需要位于 after 内部循环而不是 before 内部循环。你现在可以再试一次。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多