2017-01-16 2 views
-1

Я искал способ фильтрации массива на основе цикла Еогеаспа по двум параметрам ..PHP Еогеасп + по-прежнему не работает на многомерном массиве

есть в моем выходе следующего массив:

[ 
    { 
    "entry_id": "1", 
    "title": "something", 
    "grades": [ 
     "3", 
     "4", 
     "5", 
     "6" 
    ], 
    "subject": [ 
     "science" 
    ] 
    }, 
    { 
    "entry_id": "2", 
    "title": "something else", 
    "grades": [ 
     "7", 
     "8", 
     "9", 
     "10" 
    ], 
    "subject": [ 
     "math" 
    ] 
    }, 
] 

Я пытаюсь вернуть только entry_id 2 с помощью foreach + break, от того, что я читал, кажется, что это должно работать ..

$subject = 'math'; 
$grade = '10'; 

foreach ($results as $key => &$result) { 
     if($subject && !in_array($subject, $result['subject'])){ 
      break; 
     } 
     if($grade && !in_array($grade, $result['grades'])){ 
      break; 
     } 
} 

Но это возвращая все записи.

+1

Вы не имеете 'return' заявление, как это возвращение что-нибудь? – Barmar

+0

'continue' означает пропустить остальную часть тела цикла и перейти к следующей итерации цикла. Но у вас нет ничего в теле цикла, поэтому он не имеет никакого эффекта. – Barmar

+0

Если вы хотите остановить цикл, используйте 'break'. – Barmar

ответ

0

Кажется, вам нужно добавить текущую запись в новый массив, когда он пройдет любой из тестов. Поэтому измените тест !in_array() на in_array() и добавьте к нему результат, который находится в этом блоке if.

$realresults = array(); 
foreach ($results as $key => &$result) { 
    if($subject && in_array($subject, $result['subject'])){ 
     $realresults[] = $result; 
    } elseif($grade && in_array($grade, $result['grades'])){ 
     $realresults[] = $result; 
    } 
} 
+0

Yep - попробовал это, но он работает только для первого параметра, если вы попытаетесь отфильтровать результаты дальше вторым (оценка в этом случае), это не сработает: -/ –

+0

Он содержит только результаты, соответствующие обоим параметрам. Вы хотите сохранить результаты, соответствующие любым критериям? – Barmar

+0

Да, по критериям или критериям ... но я думаю, что они тоже были бы предпочтительны? Как если бы я сначала отфильтровал по теме, у меня могло бы быть не так много результатов, как если бы я отфильтровал другой путь, как сначала. Таким образом, мое предпочтение подчиняется сначала, а затем классу ... –

0

После поиска несколько больше кажется, что неустановленные + array_values ​​будет делать то, что мне нужно:

foreach ($results as $key => &$result) { 
    if($subject && !in_array($subject, $result['subject'])){ 
     unset($results[$key]); 
     $results = array_values($results); 
    } 
    if($grade && !in_array($grade, $result['grades'])){ 
     unset($results[$key]); 
     $results = array_values($results); 
    } 
}