Heim >Backend-Entwicklung >PHP-Tutorial >PHP foreach implementiert das Durchlaufen mehrdimensionaler Arrays

PHP foreach implementiert das Durchlaufen mehrdimensionaler Arrays

墨辰丷
墨辰丷Original
2018-05-30 17:21:522577Durchsuche

Dieser Artikel stellt hauptsächlich die Implementierung von PHP foreach beim Durchlaufen mehrdimensionaler Arrays vor. Er hat einen gewissen Referenzwert. Interessierte Freunde können sich auf

Einführung
Normalerweise auf unser foreach beziehen kann jeden Schlüssel => Wert im eindimensionalen Array der Reihe nach ausdrucken. Wenn es sich jedoch um ein mehrdimensionales Array handelt, muss eine Schleife in einer verschachtelten Schleife ausgeführt oder rekursiv implementiert werden. Diese Methoden sind jedoch nicht flexibel genug, weil Wenn Sie nicht sicher sind, wie viele Dimensionen das Array hat, ist es unmöglich, eine endlose verschachtelte Schleife zu erstellen. Wenn Sie jedoch nur foreach verwenden möchten, um alle Schleifen auszuschleifen, erfahren Sie, wie das geht umsetzen?

Implementierungsmethode eins
Verwendung der PHP-eigenen Iteratorklasse 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
 */

Implementierung Methode zwei
Implementieren Sie selbst eine Iteratorklasse ähnlich RecursiveIteratorIterator, um die horizontale Druckfunktion eines mehrdimensionalen Arrays zu realisieren

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();
    }
  }

Interne Ausführungsmethode

1. Foreach durchläuft unsere benutzerdefinierte foreachPrintfArr-Klasse, die automatisch die fünf internen Methoden valid(), rewind( ), key aufruft (), next() Wir müssen nur diese Methoden implementieren:

1. Mal zurückspulen ->

2.–n. Mal=> nächster -> aktueller -> Schlüssel

Das Obige ist der gesamte Inhalt davon Artikel, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:


Tutorialdetails zum Erreichen mehrerer Vererbungseffekte über die PHP-Schnittstelle, Mehrfachvererbung und Tarits

PHP-Tutorial zum Abrufen des Start- und Enddatums der Woche eines bestimmten Jahres

php
String In Vorstellungsgesprächen werden häufig Probleme mit der Umkehrung festgestellt


Das obige ist der detaillierte Inhalt vonPHP foreach implementiert das Durchlaufen mehrdimensionaler Arrays. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn