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 相关文章推荐
php生成文件
Jan 15 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
PHP读取Excel类文件
May 15 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP支付宝当面付2.0代码
Dec 21 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 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
PHP 身份验证方面的函数
2009/10/11 PHP
php实现的CSS更新类实例
2014/09/22 PHP
常用PHP框架功能对照表
2014/10/23 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
学习YUI.Ext 第三天
2007/03/10 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
Python文件路径名的操作方法
2019/10/30 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
格列夫游记读书笔记
2015/07/01 职场文书