基于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 最大运行时间 max_execution_time修改方法
Mar 08 PHP
PHP中遍历stdclass object的实现代码
Jun 09 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP explode()函数用法讲解
Feb 15 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验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
python使用zip将list转为json的方法
2018/12/31 Python
Python同步遍历多个列表的示例
2019/02/19 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
国贸专业的职业规划书
2014/03/15 职场文书
村庄绿化方案
2014/05/07 职场文书
土木工程求职信
2014/05/29 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript