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 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
mysql总结之explain
Feb 27 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 PHP
PHP读取Excel类文件
May 15 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 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
javascript document.referrer 用法
2009/04/30 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
记录Django开发心得
2014/07/16 Python
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python中的urllib模块使用详解
2015/07/07 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
python实现逻辑回归的方法示例
2017/05/02 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
Python匿名函数及应用示例
2019/04/09 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python实现单链表的方法示例
2019/09/03 Python
Python实现图像的垂直投影示例
2020/01/17 Python
Python中如何添加自定义模块
2020/06/09 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
学生社团文化节开幕式主持词
2014/03/28 职场文书
元旦晚会活动总结
2014/07/09 职场文书
劳动仲裁调解书
2015/05/20 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
Go语言特点及基本数据类型使用详解
2022/03/21 Golang