【问题标题】:How to iterate through multidimentional array and show Index如何遍历多维数组并显示索引
【发布时间】:2016-12-02 07:53:10
【问题描述】:

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

$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

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

【问题讨论】:

    标签: php arrays multidimensional-array associative-array


    【解决方案1】:

    你可以用这个

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

    【讨论】:

      【解决方案2】:

      用普通的for循环替换你内部的两个foreach循环。

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

      【讨论】:

        【解决方案3】:

        请看以下代码:

        //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】:

        试试这个

         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
             }
        
        }
        

        【讨论】:

          【解决方案5】:

          使用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 函数按任何条件(关于学科)过滤学生,而无需重写函数本身。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-25
              • 1970-01-01
              • 2019-08-15
              • 2014-10-03
              • 1970-01-01
              • 2012-04-16
              相关资源
              最近更新 更多