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面向对象的使用教程 简单数据库连接
Nov 25 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
php生成html文件方法总结
Dec 01 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
PHP中Array相关函数简介
Jul 03 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
django中的ajax组件教程详解
Oct 18 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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 daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
克隆javascript对象的三个方法小结
2011/01/12 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
js中开关变量使用实例
2017/02/24 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
Vue实现选择城市功能
2017/05/27 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
python中Genarator函数用法分析
2015/04/08 Python
python发送HTTP请求的方法小结
2015/07/08 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
行政专员的岗位职责
2014/03/10 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
大学辅导员述职报告
2015/01/10 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
Golang jwt身份认证
2022/04/20 Golang