php foreach遍历多维数组长度,PHP foreach遍历多维数组实现方式
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遍历多维数组实现方式相关推荐
- c++ 一维数组长度_每天一点C / 一维数组和指针
哈喽,我是老吴,继续记录我的学习心得. 每天一点系列是我对微习惯的践行.现在能做到每天一点 C,将来就会有更多的每天一点系列,没人规定嵌入式软件工程师就只能学习 C 语言和折腾 Linux,不要给自己 ...
- Java 解决数组长度不可变问题 Java 重新定义数组
// 解决数组长度不可变的问题 // 因为数组在定义的时候已经给定了长度,所以如果有新的元素加入,数组的本身已经放不下了 // 这时候就需要重新将原数组的元素拿出来重新定义数组,将旧元素和新元素重新赋 ...
- js 多维数组长度_C++申请与释放动态数组1(学习笔记:第6章 16)
分配和释放动态数组[1] 分配: new 类型名T [ 数组长度 ] 数组长度可以是任何表达式,在运行时计算 释放:delete[] 数组名p 释放指针p所指向的数组. p必须是用new分配得到的数组 ...
- java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...
思路一 先找到最长的数组,然后循环短的数组并判断元素是否在长数组中 public class Main { public static void main(String[] args) throws ...
- python中对比数组长度_在Python中检索数组长度的首选方法
python中对比数组长度 The __len__() is a method on container types. However, python also provides another op ...
- java 数组下标和值的关系_java数组长度可以改变吗?与数组下标有何异同?
大家了解什么是数组长度吗?什么是数组下标吗?经常有人将这两个词混淆,今天呢,小编给小伙伴们带来了有关数组的相关知识,就让我们一起了解了解吧. 有的人说数组是可以改变,有的人说数组是不可以.然而我在使用 ...
- c语言整形数组长度_c语言中如何求数组长度
展开全部 1.c语言中,e5a48de588b63231313335323631343130323136353331333337613861定义数组后可以用sizeof命令获得数组的长度(可容纳元素个 ...
- python二维列表长度_python如何使二维数组的高度大于长度
代码如下(意见传播模型):#-*-coding:utf-8-*-"""CreatedonSunMar3020:19:562014@author:wangz"&q ...
- php遍历数组对象数组长度,PHP循环遍历对象数组会产生意外结果
我有以下 PHP代码为每个帖子设置parentId. 每个数据的parentId都成为最后一个帖子ID. 我的逻辑出了什么问题? 顺便说一句,如果我把它改成数组,那么每一件事都可以.请帮忙! $dat ...
最新文章
- leetcode 24: 两两交换链表中的节点
- pecl.php.net,WARNING: channel pecl.php.net has updated its protocols, use pecl channel-update pec...
- Spring MVC 教程,快速入门,深入分析——多视图控制器
- 让开发自动化: 利用 Ivy 管理依赖项
- c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符
- linux qt getpid,[QTA] Android 动态注入原理分析
- wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序
- router vue 动态改变url_vue里router-link标签设置动态路由的3个方法
- 去哪儿网2017春招在线笔试
- Redis学习之路(二)之Redis入门基础
- 红队常用的防守策略.
- android七牛短视频sdk源码,七牛短视频sdk,七牛android直播端必须用七牛提供的sdk吗...
- D. Deleting Divisors
- stratch pragramming
- linux 内核printk 打印信息查询方法
- vue3—reactive如何更改属性
- ubuntu 18.04中的shutter无法编辑截图
- arcgis server 学习(一) 地图要素查询
- hp vse虚拟服务器,HP9000用户升级硬件平台的捷径
- 单片机中c语言 右移 和左移 与CY
热门文章
- 华为海思超过MTK,成为亚洲最大半导体供应商。
- 1、入职薪水10K,每年涨幅5%,50年后工资多少? 5% ---05 第一年的工资:10000第二年的工资:10000 + 10000*0.05
- 一、安装Centos 6.5
- Dart 与 C 的互相调用
- 浅谈运营商BMO融合于5G的关系
- 《水经注地图服务》发布的卫星影像数据在Global Mapper中调用
- 休闲爱好--英文单词
- linux安装JDK1.8详细步骤
- smarty中使用php函数,在smarty模板中使用PHP函数的方法
- project 2013 安装程序找不到office.zh-cn\officeMUI.xml