基于PHP遍历数组的方法汇总分析


Posted in PHP onJune 08, 2013

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 多个submit提交表单 处理方法
Jul 07 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
May 21 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
PHP实现清除MySQL死连接的方法
Jul 23 PHP
php版微信小店API二次开发及使用示例
Nov 12 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
php获取linux命令结果的实例
Mar 13 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 #PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 #PHP
处理单名多值表单的详解
Jun 08 #PHP
探讨fckeditor在Php中的配置详解
Jun 08 #PHP
php创建基本身份认证站点的方法详解
Jun 08 #PHP
编写安全 PHP应用程序的七个习惯深入分析
Jun 08 #PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 #PHP
You might like
PHP 和 HTML
2006/10/09 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php多重接口的实现方法
2015/06/20 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
20招让你的Python飞起来!
2016/09/27 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python模块搜索路径代码详解
2018/01/29 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
运动会入场解说词300字
2014/01/25 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
公司活动总结范文
2014/07/01 职场文书
应届大学生求职信
2014/07/20 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python