PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)


Posted in PHP onJuly 05, 2014

一、数组遍历的3个方法介绍

1. foreach()

foreach()是一个用来遍历数组中数据的最简单有效的方法。

#example1:

<?php

$colors= array('red','blue','green','yellow');

foreach ($colorsas$color){

echo "Do you like $color? <br />";

}

?>

显示结果:

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?

2. while()

while() 通常和 list(),each()配合使用。

#example2:

<?php

$colors= array('red','blue','green','yellow');

while(list($key,$val)= each($colors)) {

echo "Other list of $val.<br />";

}

?>

显示结果:

Other list of red.
Other list of blue.
Other list of green.
Other list of yellow.

3. for()

#example3:

<?php

$arr= array ("0"=> "zero","1"=> "one","2"=> "two");

for ($i= 0;$i< count($arr); $i++){

$str= $arr[$i];

echo "the number is $str.<br />";

}

?>

显示结果:

the number is zero.
the number is one.
the number is two.

二、数组指针操作函数介绍

key()

mixed key(array input_array)

key()函数返回input_array中位于当前指针位置的键元素。

#example4

<?php

$capitals= array("Ohio"=> "Columbus","Towa"=> "Des Moines","Arizona"=> "Phoenix");

echo "<p>Can you name the capitals of these states?</p>";

while($key= key($capitals)) {

echo $key."<br />";

next($capitals);

//每个key()调用不会推进指针。为此要使用next()函数

}

?>

显示结果:

Can you name the capitals of these states?
Ohio
Towa
Arizona

reset()

mixed reset(array input_array)

reset()函数用来将input_array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组,就经常使用这个函数,另外这个函数还常用于排序结束时。

#example5 - 在#example1上追加代码

<?php

$colors= array('red','blue','green','yellow');

foreach ($colorsas$color){

echo "Do you like $color? <br />";

}

reset($colors);

while(list($key,$val)= each($colors)) {

echo "$key=> $val<br />";

}

?>

显示结果:

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
0 => red
1 => blue
2 => green
3 => yellow

注意:将一个数组赋值给另一个数组时会重置原来的数组指针,因此在上例中如果我们在循环内部将 $colors 赋给了另一个变量的话将会导致无限循环。
例如将 $s1 = $colors; 添加到while循环内,再次执行代码,浏览器就会无休止地显示结果。

each()

array each(array input_array)

each()函数返回输入数组当前键/值对,并将指针推进一个位置。返回的数组包含四个键,键0和key包含键名,而键1和value包含相应的数据。如果执行each()前指针位于数组末尾,则返回FALSE。

#example6

<?php

$capitals= array("Ohio"=> "Columbus","Towa"=> "Des Moines","Arizona"=> "Phoenix");

$s1= each($capitals);

print_r($s1);

?>

显示结果:

Array ( [1] => Columbus [value] => Columbus [0] => Ohio [key] => Ohio )

current(),next(),prev(),end()

mixed current(array target_array)

current()函数返回位于target_array数组当前指针位置的数组值。与next()、prev()、和end()函数不同,current()不移动指针。
next()函数返回紧接着放在当前数组指针的下一个位置的数组值。
prev()函数返回位于当前指针的前一个位置的数组值,如果指针本来就位于数组的第一个位置,则返回FALSE。
end()函数将指针移向target_array的最后一个位置,并返回最后一个元素。

#example7

<?php

$fruits= array("apple","orange","banana");

$fruit= current($fruits); //return "apple"

echo $fruit."<br />";

$fruit= next($fruits); //return "orange"

echo $fruit."<br />";

$fruit= prev($fruits); //return "apple"

echo $fruit."<br />";

$fruit= end($fruits); //return "banana"

echo $fruit."<br />";

?>

显示结果:

apple
orange
apple
banana

三、测试三种遍历数组的速度

一般情况下,遍历一个数组有三种方法,for、while、foreach。其中最简单方便的是foreach。下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间。

测试环境:
Intel Core Due2 2GHz
2GB 1067MHz DDR3
Mac OS X 10.5.7
Apache 2.0.59
MySQL 5.0.41
PHP 5.2.6

#example8

<?php

$arr= array();

for($i= 0; $i< 50000; $i++){

$arr[]= $i*rand(1000,9999);

}

function GetRunTime()

{

list($usec,$sec)=explode(" ",microtime());

return ((float)$usec+(float)$sec);

}

######################################

$time_start= GetRunTime();

for($i= 0; $i< count($arr); $i++){

$str= $arr[$i];

}

$time_end= GetRunTime();

$time_used= $time_end- $time_start;

echo 'Used time of for:'.round($time_used, 7).'(s)<br /><br />';

unset($str, $time_start, $time_end, $time_used);

######################################

$time_start= GetRunTime();

while(list($key, $val)= each($arr)){

$str= $val;

}

$time_end= GetRunTime();

$time_used= $time_end- $time_start;

echo 'Used time of while:'.round($time_used, 7).'(s)<br /><br />';

unset($str, $key, $val, $time_start, $time_end, $time_used);

######################################

$time_start= GetRunTime();

foreach($arr as$key=> $val){

$str= $val;

}

$time_end= GetRunTime();

$time_used= $time_end- $time_start;

echo 'Used time of foreach:'.round($time_used, 7).'(s)<br /><br />';

?>

测试结果:

Used time of for:0.0228429(s)

Used time of while:0.0544658(s)

Used time of foreach:0.0085628(s)

经过反复多次测试,结果表明,对于遍历同样一个数组,foreach速度最快,最慢的则是while。从原理上来看,foreach是对数组副本进行操作(通过拷贝数组),而while则通过移动数组内部指标进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。原因应该是,foreach是PHP内部实现,而while是通用的循环结构。所以,在通常应用中foreach简单,而且效率高。在PHP5下,foreach还可以遍历类的属性。

PHP 相关文章推荐
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
PHP设计模式之结构模式的深入解析
Jun 13 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
php的XML文件解释类应用实例
Sep 22 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
PHP 文件上传限制问题
Sep 01 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
php遍历数组的4种方法总结
Jul 05 #PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 #PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 #PHP
php socket客户端及服务器端应用实例
Jul 04 #PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 #PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 #PHP
成为好程序员必须避免的5个坏习惯
Jul 04 #PHP
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
php根据日期显示所在星座的方法
2015/07/13 PHP
javascript add event remove event
2008/04/07 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
Vue3为什么这么快
2020/09/23 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Python如何计算语句执行时间
2019/11/22 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Python实现疫情地图可视化
2021/02/05 Python
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
如何在Shell脚本中使用函数
2015/09/06 面试题
Ruby如何定义一个类
2012/10/08 面试题
开办加工厂创业计划书
2014/01/03 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
优秀企业获奖感言
2014/02/01 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android