zoukankan      html  css  js  c++  java
  • 浅析PHP中for与foreach两个循环结构遍历数组的区别

    遍历一个数组是编程中最常见不过的了,这里跟大家讨论下for和foreach两种方法。用这两种方法执行遍历的场景太多太多了,这里我们只针对以下两个数组作为例子来讨论。所谓管中窥豹,多少能理清一点两者的区别。

    首先,我们先准备两个用于遍历的数组:

    $arr1=array(1=>'a', 3=>22, 5=>'b', 4=>'c', 8=>'d');

    $arr2=array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', 'd'=>'ddd', 'e'=>'eee');

    一:for循环结构

    循环1:

    for($i=0,$num=count($arr1);$i<$num;$i++){

        echo $arr1[$i].' ';

    }

    输出结果:a 22 c

    循环2:

    for($i=0,$num=count($arr2);$i<$num;$i++){

        echo $arr2[$i].' ';

    }

    此段语句没有输出

    分析:

    循环1只打印出了数组$arr1的前两个单元,而循环2中的$arr2则什么都没打印出来。

    原因在于for循环的时候是按照数字递增的,因此for只能访问键为数字的数组,例如循环1按照$i=0到$i=4去递增访问$arr1数组中键为0到4的单元,但该数组中的键依次为:1,3,5,4,8。而键值超过4的数组单元(5=>’b’,8=>’d’)不会被访问到,因为count($arr1)=5,故$i<5; 因此最后输出结果只有:a 22 c ;对于$arr2中所有的键都是字符,并非数字,所以循环2中没有输出。

    二:foreach循环结构

    循环3:

    foreach($arr1 as $key=>$value){

        echo $key.'=>'.$value.' ';

    }

    输出结果:1=>a 3=>22 5=>b 4=>c 8=>d

    循环4:

    foreach($arr2 as $key=>$value){

        echo $key.'=>'.$value.' ';

    }

    输出结果:a=>aaa b=>bbb c=>ccc d=>ddd e=>eee

    分析:

    foreach循环结构是按照数组内部的指针去循环的,当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。因此下一次循环中将会得到下一个单元,不需要按照数组的键来遍历整个数组。这也是foreach与for的不同之处。当然,foreach只能用于数组和对象,并且由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。

    注:for每次循环都操作对应索引下的值,对于每个值的改变也都会反映到被遍历的对象中。而foreach每次操作一个单元,都是将其索引和值分别取到变量中,或者只取出值到一个变量中,然后单独操作放有索引和值的变量,不会影响到被遍历的对象本身。如果要在遍历过程中修改对象中的值,需要在声明是在变量前加&符号。例如:foreach($array as &$value)。

    结论:如果一个数组是使用连续的数字最为数组单元的键,那么可以使用for循环结构。如果不确定数组的键或者数组的键有包含字符的,应当使用foreach循环结构。

  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/LO-gin/p/6026441.html
Copyright © 2011-2022 走看看