PHP遍历数组的三种方法及效率对比分析


Posted in PHP onFebruary 12, 2015

本文实例分析了PHP遍历数组的三种方法及效率对比。分享给大家供大家参考。具体分析如下:

今天有个朋友问我一个问题php遍历数组的方法,告诉她了几个。顺便写个文章总结下,如果总结不全还请朋友们指出

第一、foreach()

foreach()是一个用来遍历数组中数据的最简单有效的方法。

<?php 
    $urls= array('aaa','bbb','ccc','ddd');
    foreach ($urls as $url){ 
      echo "This Site url is $url! <br />";
    } 
?>

显示结果:

This Site url is aaa 
This Site url is bbb 
This Site url is ccc 
This Site url is ddd

第二、while() 和 list(),each()配合使用。

<?php 
    $urls= array('aaa','bbb','ccc','ddd'); 
    while(list($key,$val)= each($urls)) { 
      echo "This Site url is $val.<br />"; 
    } 
?>

显示结果:

This Site url is aaa
This Site url is bbb
This Site url is ccc
This Site url is ddd

第三、for()运用for遍历数组

<?php 
    $urls= array('aaa','bbb','ccc','ddd'); 
    for ($i= 0;$i< count($urls); $i++){ 
      $str= $urls[$i]; 
      echo "This Site url is $str.<br />"; 
    } 
?>

显示结果:

This Site url is aaa 
This Site url is bbb 
This Site url is ccc 
This Site url is ddd

有时候有人也在问这几种遍历数组的方法哪个更快捷些呢,下面做个简单的测试就明白了

下面来测试三种遍历数组的速度

一般情况下,遍历一个数组有三种方法,for、while、foreach。其中最简单方便的是foreach。下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间。

<?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 相关文章推荐
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
php 删除cookie方法详解
Dec 01 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
php生成4位数字验证码的实现代码
Nov 23 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
php实现评论回复删除功能
May 23 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
PHP进程同步代码实例
Feb 12 #PHP
PHP CURL 内存泄露问题解决方法
Feb 12 #PHP
PHP中捕获超时事件的方法实例
Feb 12 #PHP
php单例模式示例分享
Feb 12 #PHP
PHP 正则表达式小结
Feb 12 #PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 #PHP
PHP动态输出JavaScript代码实例
Feb 12 #PHP
You might like
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
destoon常用的安全设置概述
2014/06/21 PHP
jquery中ajax学习笔记3
2011/10/16 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
Python版微信红包分配算法
2015/05/04 Python
Python字符串替换实例分析
2015/05/11 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python str字符串转uuid实例
2020/03/03 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
管理标语大全
2014/06/24 职场文书
2014年药房工作总结
2014/11/22 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
小学生暑假安全公约
2015/07/14 职场文书
《圆的周长》教学反思
2016/02/17 职场文书