Maison  >  Article  >  développement back-end  >  PHP foreach implémente la traversée de tableaux multidimensionnels

PHP foreach implémente la traversée de tableaux multidimensionnels

墨辰丷
墨辰丷original
2018-05-30 17:21:522530parcourir

Cet article présente principalement en détail l'implémentation de PHP foreach traversant des tableaux multidimensionnels. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

Introduction
Normalement, notre foreach. peut imprimer chaque clé => valeur dans le tableau unidimensionnel dans l'ordre, mais s'il s'agit d'un tableau multidimensionnel, il doit effectuer une boucle dans une boucle imbriquée ou l'implémenter de manière récursive, mais ces méthodes ne sont pas assez flexibles, car Lorsque vous n'êtes pas sûr du nombre de dimensions du tableau, il est impossible d'avoir une boucle imbriquée sans fin. Si vous utilisez la récursivité, cela peut être résolu. Mais si vous souhaitez simplement utiliser foreach pour boucler toutes les boucles, comment le faire. le mettre en œuvre ?

Première méthode d'implémentation
Utilisation de la propre classe d'itérateur de PHP, RecursiveIteratorIterator

  $test_arr = array(1,2,3,array(4,'aa'=>5,6,array(7,'bb'=>8),9,10),11,12); 
  $arrayiter = new RecursiveArrayIterator($test_arr);
  $iteriter = new RecursiveIteratorIterator($arrayiter);
  //直接打印即可按照横向顺序打印出来
  foreach ($iteriter as $key => $val){ 
    echo $key.'=>'.$val; 
  } 
  //结果
  /* 
    0=>1
    1=>2 
    2=>3
    0=>4
    aa=>5
    2=>6
    0=>7
    bb=>8
    4=>9
    5=>10
    4=>11
    5=>12
 */

Méthode d'implémentation deux
Implémentez vous-même une classe d'itérateur similaire à RecursiveIteratorIterator pour réaliser la fonction d'impression horizontale d'un tableau multidimensionnel

class foreachPrintfArr implements Iterator {
    //当前数组作用域
    private $_items; 
    private $_old_items;
    //保存每次执行数组环境栈
    private $_stack = array(); 

    public function __construct($data=array()){
      $this->_items = $data;
    }

    private function _isset(){
      $val = current($this->_items);

      if (empty($this->_stack) && !$val) {
        return false;
      } else {
        return true;
      }  
    }

    public function current() {
      $this->_old_items = null;
      $val = current($this->_items);

      //如果是数组则保存当前执行环境,然后切换到新的数组执行环境
      if (is_array($val)){
        array_push($this->_stack,$this->_items);
        $this->_items = $val;
        return $this->current();
      }

      //判断当前执行完成后是否需要切回上次执行环境
      //(1) 如果存在跳出继续执行
      //(2) 如果不存在且环境栈为空,则表示当前执行到最后一个元素
      //(3) 如果当前数组环境下一个元素不存在,则保存一下当前执行数组环境 $this->_old_items = $this->_items;
      //然后切换上次执行环境 $this->_items = array_pop($this->_stack) 继续循环, 直到当前数组环境下一个
      //元素不为空为止
      while (1) {
        if (next($this->_items)) {  
          prev($this->_items); break;
        } elseif (empty($this->_stack)) {
          end($this->_items); break;
        } else {
          end($this->_items);
          if (!$this->_old_items) 
            $this->_old_items = $this->_items;
          $this->_items = array_pop($this->_stack);
        }
      }

      return $val;
    }

    public function next() {
      next($this->_items);  
    }

    public function key() {
      // 由于 key() 函数执行在 current() 函数之后
      // 所以在 current() 函数切换执行环境 , 会导致切换之前的执行环境最后一个 key
      // 变成切换之后的key , 所以 $this->_old_items 保存一下切换之前的执行环境
      // 防止key打印出错
      return $this->_old_items ? key($this->_old_items) : key($this->_items);
    }

    public function rewind() {
      reset($this->_items);
    }

    public function valid() {                                       
      return $this->_isset();
    }
  }

Méthode d'exécution interne

1 La boucle foreach de notre classe foreachPrintfArr personnalisée appellera automatiquement les cinq méthodes internes valid( ), rembobinage. (), key(), next(), current() Il suffit d'implémenter ces méthodes

2. Séquence d'appel :
1ère fois => valide -> -> clé
2ème ~ nième fois => suivant -> valide -> clé actuelle

   $test_arr = array(1,2,3,array(4,'aa'=>5,6,array(7,'bb'=>8),9,10),11,12);
   $iteriter = new foreachPrintfArr($test_arr);
   foreach ($iteriter as $key => $val){
     echo $key.'=>'.$val;
   } 
   //结果:
   /* 
   0=>1
   1=>2
   2=>3
   0=>4
   aa=>5
   2=>6
   0=>7
   bb=>8
   4=>9
   5=>10
   4=>11
   5=>12
   */

Ce qui précède C'est tout le contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.


Recommandations associées :

Détails du didacticiel sur la façon d'obtenir plusieurs effets d'héritage via l'interface PHP, héritage et tarits multiples

Tutoriel PHP sur la façon d'obtenir la date de début et la date de fin de la semaine d'une certaine année

phpString le renversement est souvent utilisé dans les entretiens Problèmes rencontrés

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn