Я пытаюсь сравнить несоответствующие значения в двух многомерных массивах ($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);
}
}
}
Таким образом, вы получите все несоответствующие элементы.
Допустим, у вас есть идеальное совпадение 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);
}
Других решений пока нет …