each() 经常和 list() 结合使用来遍历数组。本例与上例类似,不过循环输出了整个数组:<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");reset($people);while (list($key, $val) = each($people)) //Mark_a
  {
  echo "$key => $val<br />";
  }
?>输出:
0 => Peter
1 => Joe
2 => Glenn
3 => Cleveland例子解释  // Mark_b
因为将一个数组赋值给另一个数组时会重置原来的数组指针,因此在上例中如果我们在循环内部将 $people 赋给了另一个变量的话将会导致无限循环。首先想问的是,在PHP中,数组名与在C/C++中是同样的含义吗?(即为一个符号常量,值为该数组的首地址);// 前提1
Mark_a: each函数使数组内部指针逐渐后移,当移到末端的后一位之后,each将返回FALSE, 之前返回的都是数组(each返回“数组”:可否照上述前提1所理解为内存中某块由each函数建立空间的首地址吗?亦即each每执行一次都会在内存中新开辟一块空间用来存放当前元素的key和value值,猜想这空间大概是在堆区吧?),继续讨论,最后一次返回的是FALSE,这与list的语法格式不符啊,list的右端是规定了为数组的,而现在只是一个逻辑值?但是这并没有导致最终的解释错误?
Mark_b: 照上述前提1所理解,就不能理会这段话的含义了,况且我写出了下列测试代码:<?php $people = array("Peter", "Joe", "Glenn", "Cleveland");reset($people);while ($tt = each($people))
  {
  echo "{$tt["key"]} => {$tt["value"]}<br />";
  
  }
?>
输出无误:
0 => Peter
1 => Joe
2 => Glenn
3 => Cleveland

解决方案 »

  1.   

    echo "{$tt["key"]} => {$tt["value"]}<br />";
    echo "{$tt[0]} => {$tt[1]}<br />";
    都是可以的应该不会each每执行一次都会在内存中新开辟一块空间
    数组在PHP里好象是在一个HASH表里。
    应该是直接操作这个HASH表。前面有个帖子就说了这些相关问题,是百度的人发的。去看看吧。
      

  2.   

    PHP中的数组更像是一个map或者链表。你说的each到数组尾返回false的情况,正好符合while跳出循环的条件。
      

  3.   

    php的数组都是hash,
    字符串index使用time33算法求hash值,
    整数index直接跟某个数按位与运算截断.each并没有dump整个数组,只是dump了数组的一个元素,
    并且对数组进行了zend_hash_move_forward(target_hash),
    把数组的internal指针往前移动了一个位置,
    这点跟print_r不同,print_r每次都是从头开始遍历,
    而each需要从当前位置取一个元素,each可以each($a), each($b)的多个数组穿插进行,
    所以each只能把位置信息维护在数组内部,因此each之后,索引会自动下移。
      

  4.   

    正“因为将一个数组赋值给另一个数组时会重置原来的数组指针”
    所以一般不使用 each函数 抽取数组元素在PHP中,数组名与在C/C++中是同样的含义吗?
    不是!while 循环的退出条件是:循环表达式为假(空、false、0)
      

  5.   

    list($key,$va)==each($array);
    for($i=0;$i<count($array);$i++)
    foreach($array as $key=>$value)