PHP Сравнение двух многомерных массивов с foreach

Я пытаюсь сравнить несоответствующие значения в двух многомерных массивах ($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);
}
}
}

0

Решение

Таким образом, вы получите все несоответствующие элементы.

Допустим, у вас есть идеальное совпадение a, b, c в $allSessions и а, б, в $userSessions, В вашем первом внешнем цикле у вас есть «а». Во внутреннем цикле вы добавите ‘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);
}
0

Другие решения

Других решений пока нет …