700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > PHP foreach实现遍历多维数组方式

PHP foreach实现遍历多维数组方式

时间:2019-03-18 09:13:33

相关推荐

PHP foreach实现遍历多维数组方式

后端开发|php教程

foreach,php,数组

后端开发-php教程

这篇文章主要为大家详细介绍了PHP foreach遍历多维数组实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

城市分站系统源码,vscode选中内容添加标签,ubuntu删除安装,tomcat部署工程目录,逆包爬虫,xdoc php,越秀区seo外包公司lzw

介绍

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

安卓软件源码百度云,ubuntu怎么卸载pcl,tomcat7找不到,爬虫编程面试,php数组重复,乐陵市seo优化关键词lzw

实现方式 一

采用PHP本身自带的迭代器类 RecursiveIteratorIterator

html列表页面源码,vscode转驼峰,rtklib ubuntu,tomcat 部署 名字,查看sqlite表的字段,thinksns h5插件,比较火的前端框架,电商爬虫比价系统价格,免费php模板网站,丹东seo优化报价,淘宝空包网站源码,网页自动答题器制作,phpcms如何更换模板lzw

$test_arr = array(1,2,3,array(4,aa=>5,6,array(7,b=>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=>22=>3 0=>4 aa=>5 2=>6 0=>7 bb=>8 4=>9 5=>10 4=>11 5=>12 */

实现方式 二

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

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

内部执行方式

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,b=>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 */

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。