0

Я пытаюсь сравнить несоответствующие значения в двух многомерных массивах ($allSessions, мой главный массив и $userSessions, мой внутренний массив ... все в нем должно быть в пределах $allSessions, но структурировано по-разному), и мой подход состоял в том, чтобы использовать foreach внутри цикла foreach.PHP Сравнение двух многомерных массивов с 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

foreach только что ожидает массив. ему все равно, есть ли 0, 1 или gazillions предметов. он просто перебирает все, что там есть. –

+0

Что означает '$ userSessions' с одним элементом? – bloodyKnuckles

+0

Вы уверены, что он работает, когда у вас есть более одного элемента в '$ userSessions'? Мне кажется, что вы получите все несоответствующие элементы в '$ userSessions' для каждого элемента в' $ allSessions.' –

ответ

0

так, как вы есть, вы получите все, не соответствующий элемент.

Предположим, что у вас есть идеальное соответствие a, b, c в $allSessions и a, b, c в $userSessions. В вашем первом внешнем цикле у вас есть «a». Во внутреннем цикле вы добавите 'b' и 'c' в ваш $ unregistered, потому что они не совпадают. Затем вы переходите к «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

А, я вижу. Я надеюсь, что мой массив '$ unregistered' будет любым элементом из' allSessions', который не соответствует элементу в '$ userSessions'. Я попытаюсь интегрировать 'continue'. –

+0

Если это ответили на ваш вопрос, отметьте его как принятый ответ. –

+0

Спасибо. К сожалению, этого не произошло. У меня есть грязное решение, работающее прямо сейчас, и я надеюсь на рефакторинг. Я планирую обновить это, когда найду его. –