美文网首页程序员@IT·互联网技术文
PHP-foreach遍历多维数组实现

PHP-foreach遍历多维数组实现

作者: 简单方式 | 来源:发表于2016-08-01 14:57 被阅读1003次

    介绍

    正常我们的foreach可以按顺序把一维数组里面每个 key => value 打印出来,但是如果是多维数组则需要循环在嵌套循环,或则递归实现,但是这些方式都不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境的嵌套循环,如果采用递归到可以解决,但是如果只想使用foreach全部循环出来该如何实现?

    实现方式 一

    采用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.'<br/>'; 
       } 
       //结果
         /* 
          0 => 1
          1 => 2
          2 => 3
          0 => 4
          aa => 5
          1 => 6
          0 => 7
          bb => 8
          3 => 9
          4 => 10
          4 => 11
          5 => 12
        */
    

    实现方式 二

    自己实现一个类似于 RecursiveIteratorIterator 的迭代器类,实现多维数组横向打印功能

    class foreachPrintArr implements Iterator
    {
        //当前数组作用域
        private $_items;
    
        //保存每次执行数组环境栈
        private $_stack = array();
    
        public function __construct($data = array())
        {
            $this->_items = $data;
        }
    
        private function _isset()
        {
            return current($this->_items) ? true : false;
        }
    
        public function current()
        {
            $val = current($this->_items);
    
            //如果是数组则保存当前执行环境, 然后切换到新的数组执行环境
            if (is_array($val)) {
                array_push($this->_stack, $this->_items);
                $this->_items = $val;
                return $this->current();
            }
    
            return $val;
        }
    
        public function next()
        {
            //当前数组执行环境执行到最后,并且还存在上次未执行完的环境,则切换回来
            if (!next($this->_items) && !empty($this->_stack)) {
                $this->_items = array_pop($this->_stack);
                $this->next();
            }
        }
    
        public function key()
        {
            return key($this->_items);
        }
    
        public function rewind()
        {
            reset($this->_items);
        }
    
        public function valid()
        {
            return $this->_isset();
        }
    }
    

    内部执行方式

    1. foreach 循环我们自定义的foreachPrintfArr类,会自动调用内部这5个方法 valid()rewind()key()next()current() 我们只需要实现这几个方法即可.

    2. 调用顺序:
      第1次 => rewind -> valid -> current -> key
      第2次~n次 => next -> valid -> current -> key

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

    相关文章

      网友评论

        本文标题:PHP-foreach遍历多维数组实现

        本文链接:https://www.haomeiwen.com/subject/adgxsttx.html