基于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扩展编写点滴 技巧收集
Mar 09 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
Mar 17 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
PHP xpath()函数讲解
Feb 11 PHP
PHP中命名空间的使用例子
Mar 22 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 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程序猿都应该拜读的书
2014/12/31 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
Display SQL Server Version Information
2007/06/21 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
Python中自定义函数的教程
2015/04/27 Python
Python 闭包的使用方法
2017/09/07 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
为数据库创建索引都需要注意些什么
2012/07/17 面试题
酒店办公室文员岗位职责
2013/12/18 职场文书
给女朋友的道歉信
2014/01/10 职场文书
财产公证书样本
2014/04/04 职场文书
2014年社区工作总结
2014/11/18 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
开学典礼校长致辞
2015/07/29 职场文书
常用的Python代码调试工具总结
2021/06/23 Python