如何遍历多维数组并显示索引

时间:2016-12-02 07:53:11

标签: php arrays multidimensional-array associative-array

我正在编写一个程序,我正在使用多维数组。该概念将输入主题名称,并将显示该学生正在学习该主题的索引。

$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

但我不知道如何实现这一目标。

6 个答案:

答案 0 :(得分:1)

您可以使用此

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

答案 1 :(得分:0)

用正常的for循环覆盖数组长度替换内部的两个 foreach 循环。

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

答案 2 :(得分: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
     }

}

答案 3 :(得分: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>";

}

答案 4 :(得分: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_keysarray_walk

对于这样简单的任务,这可能看起来像很多代码。但是这种方法可以帮助您学习编写解耦的可重用代码。正如我所提到的,我们可以使用我们的filterStudensBySubject函数来过滤学生的任何条件(关于主题),而无需重写函数本身。

答案 5 :(得分:0)

如果我们要检查多个主题,我的贡献

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

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

这会将$ arr与所有主题进行比较并返回索引。