PHP 遍历数组的方法汇总

From: http://www.cnblogs.com/jamespb/archive/2011/09/01/2161673.html

1. foreach()

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

#example1:

  1. <?php
  2. $colors= array('red','blue','green','yellow');
  3. foreach ($colorsas$color){
  4. echo "Do you like $color? <br />";
  5. }
  6. ?>


显示结果:

Do you like red? 
Do you like blue? 
Do you like green? 
Do you like yellow?

2. while()

while() 通常和 list(),each()配合使用。

#example2:

  1. <?php
  2. $colors= array('red','blue','green','yellow');
  3. while(list($key,$val)= each($colors)) {
  4. echo "Other list of $val.<br />";
  5. }
  6. ?>

显示结果:

Other list of red. 
Other list of blue. 
Other list of green. 
Other list of yellow.

3. for()

#example3:

  1. <?php
  2. $arr= array ("0"=> "zero","1"=> "one","2"=> "two");
  3. for ($i= 0;$i< count($arr); $i++){
  4. $str= $arr[$i];
  5. echo "the number is $str.<br />";
  6. }
  7. ?>

显示结果:

the number is zero. 
the number is one. 
the number is two.

========= 以下是函数介绍 ==========

key()

mixed key(array input_array)

key()函数返回input_array中位于当前指针位置的键元素。

#example4

  1. <?php
  2. $capitals= array("Ohio"=> "Columbus","Towa"=> "Des Moines","Arizona"=> "Phoenix");
  3. echo "<p>Can you name the capitals of these states?</p>";
  4. while($key= key($capitals)) {
  5. echo $key."<br />";
  6. next($capitals);
  7. //每个key()调用不会推进指针。为此要使用next()函数
  8. }
  9. ?>

显示结果:

Can you name the capitals of these states? 
Ohio 
Towa 
Arizona

reset()

mixed reset(array input_array)

reset()函数用来将input_array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组,就经常使用这个函数,另外这个函数还常用于排序结束时。

#example5 - 在#example1上追加代码

  1. <?php
  2. $colors= array('red','blue','green','yellow');
  3. foreach ($colorsas$color){
  4. echo "Do you like $color? <br />";
  5. }
  6. reset($colors);
  7. while(list($key,$val)= each($colors)) {
  8. echo "$key=> $val<br />";
  9. }
  10. ?>

显示结果:

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

  1. <?php
  2. $capitals= array("Ohio"=> "Columbus","Towa"=> "Des Moines","Arizona"=> "Phoenix");
  3. $s1= each($capitals);
  4. print_r($s1);
  5. ?>

显示结果:

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

  1. <?php
  2. $fruits= array("apple","orange","banana");
  3. $fruit= current($fruits); //return "apple"
  4. echo $fruit."<br />";
  5. $fruit= next($fruits); //return "orange"
  6. echo $fruit."<br />";
  7. $fruit= prev($fruits); //return "apple"
  8. echo $fruit."<br />";
  9. $fruit= end($fruits); //return "banana"
  10. echo $fruit."<br />";
  11. ?>

显示结果:

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

  1. <?php
  2. $arr= array();
  3. for($i= 0; $i< 50000; $i++){
  4. $arr[]= $i*rand(1000,9999);
  5. }
  6. function GetRunTime()
  7. {
  8. list($usec,$sec)=explode(" ",microtime());
  9. return ((float)$usec+(float)$sec);
  10. }
  11. ######################################
  12. $time_start= GetRunTime();
  13. for($i= 0; $i< count($arr); $i++){
  14. $str= $arr[$i];
  15. }
  16. $time_end= GetRunTime();
  17. $time_used= $time_end- $time_start;
  18. echo 'Used time of for:'.round($time_used, 7).'(s)<br /><br />';
  19. unset($str, $time_start, $time_end, $time_used);
  20. ######################################
  21. $time_start= GetRunTime();
  22. while(list($key, $val)= each($arr)){
  23. $str= $val;
  24. }
  25. $time_end= GetRunTime();
  26. $time_used= $time_end- $time_start;
  27. echo 'Used time of while:'.round($time_used, 7).'(s)<br /><br />';
  28. unset($str, $key, $val, $time_start, $time_end, $time_used);
  29. ######################################
  30. $time_start= GetRunTime();
  31. foreach($arr as$key=> $val){
  32. $str= $val;
  33. }
  34. $time_end= GetRunTime();
  35. $time_used= $time_end- $time_start;
  36. echo 'Used time of foreach:'.round($time_used, 7).'(s)<br /><br />';
  37. ?>

测试结果:

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还可以遍历类的属性。

转载于:https://www.cnblogs.com/joeblackzqq/p/4428280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF自定义控件与样式(1)-矢量字体图标(iconfont)

原文:WPF自定义控件与样式(1)-矢量字体图标(iconfont)一&#xff0e;图标字体 图标字体在网页开发上运用非常广泛&#xff0c;具体可以网络搜索了解&#xff0c;网页上的运用有很多例子&#xff0c;如Bootstrap。但在C/S程序中使用还不多&#xff0c;字体图标其实就是把矢量图…

从菜鸟到伟大的征程

自我介绍&#xff1a; 我是carol&#xff0c;现在是一名菜鸟程序员&#xff0c;我励志成为像尼奥那样的hacker&#xff0c;尽管有很多的不现实性&#xff0c;但是丝毫不减我对于这方面的热情。其实&#xff0c;说到底我并不是很 喜欢编程&#xff0c;尤其是现在的编程方式&…

Linux下快速搭建DNS服务器

一、术语解释:TTL Time To Live 缓冲保留时间ORIGIN 属于哪个域 代指域IN 开头需要空格SOA 一行记录类型的开始参数&#xff1a;forwarders {} 指向自己无法解析的域名跳转到外部dns服务测试方法&#xff1a;host 域名&#xff08;host IP&#xff09; 使用nslookup方法测试 使…

IOS

http://blog.csdn.net/zc639143029/article/details/47112179转载于:https://www.cnblogs.com/redasurc/p/5007986.html

解决Cacti监控图像断断续续问题

最近cacti的图像全都是断断续续。新加的设备&#xff0c;图像也是这样&#xff0c;查看cacti 的log发现大量下面类似的错误信息&#xff1a;04/12/2011 03:54:37 PM - SPINE: Poller[0] Host[233] DS[4990] WARNING: SNMP timeout detected [500 ms], ignoring host 192.168.2.…

LintCode: Search A 2d Matrix

1. 设查找的数位y&#xff0c;第一行最后一列的数位x 如果x<y&#xff0c;x是第一行最大的&#xff0c;所以第一行都小于y&#xff0c;删除第一行&#xff1b; 如果x>y&#xff0c;x是最后一列最小的&#xff0c;所以最后一列都大于y&#xff0c;删除最后一列&#xff1b…

C++ this 指针

This 指针&#xff1a;this 是C中的一个关键字&#xff0c;也是一个常量指针&#xff0c;指向当前对象&#xff08;具体说是当前对象的首地址&#xff09; 。通过 this&#xff0c;可以访问当前对象的成员变量和成员函数 。 Student Stu ; //通过Student类创建对象 Stu Stude…

css3 loading 效果1

代码&#xff1a; <!doctype html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> <style> #box{position: relative;margin: 100px;} #box span{display: block;width: 9px;height: …

计算几何 - XOJ 1171 线段求交

问题 Description 线段求交即给定一组线段求出这些线段的相交情况&#xff0c;它是计算几何的基础问题之一,有着广泛的应用. Input第一行为一个正整数n表示线段的个数&#xff08;n<10000&#xff09;第二行到第n1行每行包括4个正整数x1,y1,x2,y2, (0 < x1,y1,x2,y2 <…

类成员函数解析

1、 构造函数&#xff1a; &#xff08;1&#xff09; 定义&#xff1a;是一个特殊的成员函数&#xff0c;名字与类名相同&#xff0c;创建类类型对象时&#xff0c;由编译器自动调用&#xff0c;在对象的生命周期内只且只调用一次&#xff0c;以保证每个数据成员都有一…

微信开发学习日记(六):weiphp框架

最近重点在看weiphp这个开源的第三方微信公众平台框架。在网上找微信资料&#xff0c;找到了这个。很早之前&#xff0c;就初步学习了Thinkphp和Onethink2个开源框架&#xff0c;当看到weiphp是用这2个框架开发的时候&#xff0c;我就更愿意去学习&#xff0c;毕竟学习成本很低…

SVN常用命令备注

1、将文件checkout到本地目录 svn checkout path&#xff08;path是服务器上的目录&#xff09; 例如&#xff1a;svn checkout svn://192.168.1.1/pro/domain 简写&#xff1a;svn co 2、往版本库中添加新的文件 svn add file 例如&#xff1a;svn add test.php(添加test.php)…

add-apt-repository cloud-archive:liberty

apt-get update && apt-get upgrade; v

日期类Date

#include <iostream>using namespace std;//日期是否合法//日期比较//两个日期中间差的天数//日期加上或减去一定的天数后的日期class Date{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream…

Linux下编译安装Apache httpd 2.4

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。当前Apache版本为2.4&#xff0c;本文主要描述基于CentOS 6.5以源码方式安装Apache httpd。 一…

选取硬币问题

有1元&#xff0c;5元&#xff0c;10元&#xff0c;50元&#xff0c;100元&#xff0c;500元的硬币各c0,c1,c2,c3,c4, c5枚 现在要使用这些硬币支付n元&#xff0c;问最少需要多少枚硬币&#xff0c;假设至少存在一种方案。 应该尽可能使用500元的&#xff0c;然后再使用100元的…

SAP OBYC自动记账的实例说明 +VALUE STRING

对Value String定义&#xff1a;定义了一系列的步骤优先顺序&#xff0c;每一个步骤都连接到不同的过账事务码&#xff0c;而这个顺序本身就称作价值串。价值串你可以看作是一种记账的规则&#xff0c;为物料移动或者发票校验包含了一系列的科目分配特征。并且物料移动的科目确…

C++ 继承解析

继承 1、概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体…

javascript window.open

翻译原文&#xff1a;open methodOpens a new window and loads the document specified by a given URL.Navigates the app window to the specified location.Syntaxvar retval window.open(url, name, features, replace);Parametersurl [in, optional] Type: String …

[傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论

这份是本人的学习笔记&#xff0c;课程为网易公开课上的斯坦福大学公开课&#xff1a;傅里叶变换及其应用。 卷积在滤波中的应用 浑浊度&#xff08;Turbidity&#xff09;研究是关于测量水的清澈度的研究。大致方法是把光传感器放置到深水区域&#xff0c;然后测量光线的昏暗程…