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 相关文章推荐
php5 图片验证码实现代码
Dec 11 PHP
php iconv() : Detected an illegal character in input string
Dec 05 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
php 购物车完整实现代码
Jun 05 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
php插入mysql数据返回id的方法
May 31 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php取出数组单个值的方法
2018/03/12 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
关于孝道的演讲稿
2014/05/21 职场文书
归元寺导游词
2015/02/06 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL