2016-12-02 2 views
0

Я пишу программу, в которой я использую многомерный массив. Концепция войдет в имя субъекта, и будет показано, что ученик изучает этот предмет.Как выполнить итерацию по многомерному массиву и показать индекс

$var= [ 'Abdullah'=>['full_name'=>'Abdullah_Faraz', 
       'Subject'=>['English','Urdu','Maths']], 

    'Hamid'=>['full_name'=>'Hamid_Amjad', 
       'Subject'=>['PHP','Urdu','C++']], 

    'Abid'=>['full_name'=>'Abid_Ali', 
       'Subject'=>['OOP','OS','Calculus']], 

    'Aqeel'=>['full_name'=>'Aqeel_Bhutta', 
       'Subject'=>['Economics','Statistics','Big_Data']] 

];

foreach ($var as $key => $value) { 
foreach ($value as $key1 => $value1) { 
    foreach ($value1 as $value2) { 

     if($value2='Urdu'){ 
      echo $key; 
    }  
} 
} 

Выход Абдулла Хамид

, но теперь я хочу, чтобы показать индекс тех, кто не изучает урду ожидаемый результат должен быть

Abid 
Aqeel 

Но я не знаю, как для достижения этой цели.

ответ

1

Вы можете использовать этот

foreach ($var as $key => $value) { 
    $lang = $value['Subject'][1]; 
    if($lang != 'Urdu'){ 
     echo $key.'<br>'; 
    } 
} 
0

Замените ваши внутренние два байта foreach с нормальной длиной в контуре.

<?php 
for ($x = 0; $x < dim-Length; $x++) { 
    echo "The number is: $x <br>"; 
} 
?> 
0

попробовать это

foreach ($var as $key => $value) { 
    $flag = 0; 
    foreach ($value as $key1 => $value1) { 
     foreach ($value1 as $value2) { 

      if($value2=='Urdu'){ 
       $flag =1; 
       echo $value; 
     }  
    } 
    if($flag == 0){ 
     echo $key 
    } 

} 
0

Пожалуйста, смотрите следующие коды:

//study 'Urdu'    
foreach($var as $nickname => $data){ 
    if (in_array('Urdu', $data['Subject'])) 
     echo $nickname . "<br>"; 
} 

//not study 'Urdu' 
foreach($var as $nickname => $data){ 
    if (!in_array('Urdu', $data['Subject'])) 
     echo $nickname . "<br>"; 

} 
+0

Удивительные работы. –

+0

супер точный логика. теперь я должен посмотреть, что, если я введу несколько предметов. –

0

Такого рода задачи можно сделать проще с functional programming , В принципе, вам нужно фильтровать массив учеников по некоторым предикатам (например, предметы, которые они изучают или не изучают). Для этого мы можем написать higher-order function. Он будет использовать array_filter:

function filterStudensBySubject($students, callable $subjectCriteria = null) 
{ 
    if (is_null($subjectCriteria)) { 
     $subjectCriteria = function ($subject) { 
      return true; 
     }; 
    } 

    return array_filter($students, function ($student) use ($subjectCriteria) { 
     if (!isset($student['Subject'])) { 
      return false; 
     } 

     return $subjectCriteria($student); 
    }); 
} 

Тогда мы можем написать некоторые из условий для обеспечения этой функции:

$subjects = ['Urdu']; 
$studySubjects = function ($student) use ($subjects) { 
    return !empty(array_intersect($student['Subject'], $subjects)); 
}; 
$doesNotStudySubjects = function ($student) use ($subjects) { 
    return empty(array_intersect($student['Subject'], $subjects)); 
}; 

Мы использовали array_intersect, чтобы получить массив элементов, которые присутствуют в обоих массивах.

Наконец, мы можем получить студентов, которые изучают предметы и которые не:

$studentsWhoStudySubjects = filterStudensBySubject($var, $studySubjects); 
$studentsWhoDoNotStudySubjects = filterStudensBySubject($var, $doesNotStudySubjects); 

Вот working demo.

Этот подход позволит вам использовать ту же функцию с любыми критериями по предмету (изучать только два предмета, изучать не более трех предметов и т. Д.) Без переписывания логики цикла.

Дополнение:

Вы спрашивали о отображающих ключей:

$echoKey = function ($key) { 
    echo $key, PHP_EOL; 
}; 

$keys = array_keys($studentsWhoStudySubjects); 
array_walk($keys, $echoKey); 

echo PHP_EOL; 

$keys = array_keys($studentsWhoDoNotStudySubjects); 
array_walk($keys, $echoKey); 

Читайте о array_keys и array_walk.

Это может показаться большим количеством кода для такой тривиальной задачи.Но этот подход поможет вам научиться писать развязанный многоразовый код. Как я уже упоминал, мы можем использовать нашу функцию filterStudensBySubject, чтобы отфильтровать учащихся по любому условию (что касается предмета) без необходимости переписывать саму функцию.

0

Мой бит вклад, если мы хотим, чтобы проверить несколько объектов

$arr= array('English','Urdu','Big_Data'); 

    //study 'Urdu' 
    foreach ($var as $key => $data) { 
     if (array_intersect($arr, $data['Subject'])) { 
      echo $key . "<br>"; 
     } 
    } 

Это сравнит $ обр со всеми субъектами и вернуть индекс.

Смежные вопросы