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

来源:中文源码网    浏览: 次    日期:2018年9月2日

【下载文档:  PHP foreach遍历多维数组实现方式.txt 】

(友情提示:右键点上行txt文档名->目标另存为)

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

正常我们的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;

}

//结果

/*

0=>1

1=>2

2=>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,'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

*/以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。

亲,试试微信扫码分享本页! *^_^*

php foreach遍历多维数组长度,PHP foreach遍历多维数组实现方式相关推荐

  1. c++ 一维数组长度_每天一点C / 一维数组和指针

    哈喽,我是老吴,继续记录我的学习心得. 每天一点系列是我对微习惯的践行.现在能做到每天一点 C,将来就会有更多的每天一点系列,没人规定嵌入式软件工程师就只能学习 C 语言和折腾 Linux,不要给自己 ...

  2. Java 解决数组长度不可变问题 Java 重新定义数组

    // 解决数组长度不可变的问题 // 因为数组在定义的时候已经给定了长度,所以如果有新的元素加入,数组的本身已经放不下了 // 这时候就需要重新将原数组的元素拿出来重新定义数组,将旧元素和新元素重新赋 ...

  3. js 多维数组长度_C++申请与释放动态数组1(学习笔记:第6章 16)

    分配和释放动态数组[1] 分配: new 类型名T [ 数组长度 ] 数组长度可以是任何表达式,在运行时计算 释放:delete[] 数组名p 释放指针p所指向的数组. p必须是用new分配得到的数组 ...

  4. java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...

    思路一 先找到最长的数组,然后循环短的数组并判断元素是否在长数组中 public class Main { public static void main(String[] args) throws ...

  5. python中对比数组长度_在Python中检索数组长度的首选方法

    python中对比数组长度 The __len__() is a method on container types. However, python also provides another op ...

  6. java 数组下标和值的关系_java数组长度可以改变吗?与数组下标有何异同?

    大家了解什么是数组长度吗?什么是数组下标吗?经常有人将这两个词混淆,今天呢,小编给小伙伴们带来了有关数组的相关知识,就让我们一起了解了解吧. 有的人说数组是可以改变,有的人说数组是不可以.然而我在使用 ...

  7. c语言整形数组长度_c语言中如何求数组长度

    展开全部 1.c语言中,e5a48de588b63231313335323631343130323136353331333337613861定义数组后可以用sizeof命令获得数组的长度(可容纳元素个 ...

  8. python二维列表长度_python如何使二维数组的高度大于长度

    代码如下(意见传播模型):#-*-coding:utf-8-*-"""CreatedonSunMar3020:19:562014@author:wangz"&q ...

  9. php遍历数组对象数组长度,PHP循环遍历对象数组会产生意外结果

    我有以下 PHP代码为每个帖子设置parentId. 每个数据的parentId都成为最后一个帖子ID. 我的逻辑出了什么问题? 顺便说一句,如果我把它改成数组,那么每一件事都可以.请帮忙! $dat ...

最新文章

  1. leetcode 24: 两两交换链表中的节点
  2. pecl.php.net,WARNING: channel pecl.php.net has updated its protocols, use pecl channel-update pec...
  3. Spring MVC 教程,快速入门,深入分析——多视图控制器
  4. 让开发自动化: 利用 Ivy 管理依赖项
  5. c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符
  6. linux qt getpid,[QTA] Android 动态注入原理分析
  7. wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序
  8. router vue 动态改变url_vue里router-link标签设置动态路由的3个方法
  9. 去哪儿网2017春招在线笔试
  10. Redis学习之路(二)之Redis入门基础
  11. 红队常用的防守策略.
  12. android七牛短视频sdk源码,七牛短视频sdk,七牛android直播端必须用七牛提供的sdk吗...
  13. D. Deleting Divisors
  14. stratch pragramming
  15. linux 内核printk 打印信息查询方法
  16. vue3—reactive如何更改属性
  17. ubuntu 18.04中的shutter无法编辑截图
  18. arcgis server 学习(一) 地图要素查询
  19. hp vse虚拟服务器,HP9000用户升级硬件平台的捷径
  20. 单片机中c语言 右移 和左移 与CY

热门文章

  1. 华为海思超过MTK,成为亚洲最大半导体供应商。
  2. 1、入职薪水10K,每年涨幅5%,50年后工资多少? 5% ---05 第一年的工资:10000第二年的工资:10000 + 10000*0.05
  3. 一、安装Centos 6.5
  4. Dart 与 C 的互相调用
  5. 浅谈运营商BMO融合于5G的关系
  6. 《水经注地图服务》发布的卫星影像数据在Global Mapper中调用
  7. 休闲爱好--英文单词
  8. linux安装JDK1.8详细步骤
  9. smarty中使用php函数,在smarty模板中使用PHP函数的方法
  10. project 2013 安装程序找不到office.zh-cn\officeMUI.xml