Einführung
Normalerweise kann unser foreach jeden Schlüssel => Wert im eindimensionalen Array der Reihe nach ausdrucken, wenn jedoch mehrdimensional Arrays müssen in verschachtelten Schleifen durchlaufen oder rekursiv implementiert werden, aber diese Methoden sind nicht flexibel genug, da es unmöglich ist, endlose verschachtelte Schleifen zu haben, ohne zu wissen, wie viele Dimensionen das Array hat. Wenn Rekursion verwendet wird, kann es gelöst werden, aber wie um es zu implementieren, wenn Sie nur foreach verwenden möchten, um alles auszuschleifen?
Methode 1: Verwenden Sie die PHP-eigene 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 */
Methode 2: Implementieren Sie selbst eine Iteratorklasse ähnlich RecursiveIteratorIterator. Mehrdimensionaler Array-Horizontaldruck Funktion
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-Schleife: Unsere benutzerdefinierte foreachPrintfArr-Klasse wird automatisch aufgerufen. Wir müssen diese nur implementieren fünf interne Methoden valid(), rewind(), key(), next() und current()
2. Aufrufreihenfolge:
Das 1. Mal => zurückspulen -> aktuell ->
PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSo erstellen Sie eine Schleife für die Ausgabe eines 5-dimensionalen Arrays in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!