1. 程式人生 > >php遍歷陣列問題

php遍歷陣列問題

一、遍歷陣列的三種方式

(1)for迴圈:只能遍歷索引陣列

$arr=array('a','b','c');
$size=count($arr);
for ($i=0;$i<$size;$i++){
    echo $arr[$i];
}

(2)foreach迴圈:可以遍歷索引陣列和關聯陣列

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

foreach ($arr as $val){
    echo $val.'</br>';
}
foreach ($arr as $key=>$val
){ echo $key.'=>'.$val.'</br>'; }

(3)while、list()、each()組合迴圈:可以遍歷索引陣列和關聯陣列

each函式:

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

$lst=each($arr);
var_dump($lst);
/*結果
 array (size=4)
  1 => int 1
  'value' => int 1
  0 => string 'one' (length=3)
  'key' => string 'one' (length=3)
 */
//下一次each時將移動到下一個元素 $lst=each($arr); var_dump($lst); /*結果 1 => int 2 'value' => int 2 0 => string 'two' (length=3) 'key' => string 'two' (length=3) */

list函式:將陣列中的以整數為鍵值的元素按鍵值從小到大的順序賦給自己的引數。

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

$lst=each($arr);
var_dump($lst
); /*結果 array (size=4) 1 => int 1 'value' => int 1 0 => string 'one' (length=3) 'key' => string 'one' (length=3) */ list($key,$val)=$lst; echo $key.'=>'.$val; //結果 one=>1

while、list()、each()組合迴圈:

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

while (list($key,$val)=each($arr)){
    echo $key.'=>'.$val.'</br>';
}
/*結果
  one=>1
  two=>2
  three=>3
 */

二、foreach引用修改問題

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

foreach ($arr as &$k){
    $k=$k*2;
}
var_dump($arr);

foreach ($arr as $k){
    echo $k."</br>";
}
var_dump($arr);

結果是:
這裡寫圖片描述
Why?
Because:
這裡寫圖片描述
解決方法:

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

foreach ($arr as &$k){
    $k=$k*2;
}
var_dump($arr);

unset($k);//取消引用

foreach ($arr as $k){
    echo $k."</br>";
}
var_dump($arr);

結果:
這裡寫圖片描述

三、指標重置

while、list()、each()組合不會reset(),即指標重置,foreach遍歷會對陣列進行reset()操作。
什麼意思呢?

$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

while (list($key,$val)=each($arr)){
    echo $key.'=>'.$val.'</br>';
}
/*結果
  one=>1
  two=>2
  three=>3
 */

while (list($key,$val)=each($arr)){
    echo $key.'=>'.$val.'</br>';
}
/*結果為空 --> 指標還是指向最後一個

 */
$arr=array(
    'one'=>1,
    'two'=>2,
    'three'=>3
);

while (list($key,$val)=each($arr)){
    echo $key.'=>'.$val.'</br>';
}
/*結果
  one=>1
  two=>2
  three=>3
 */

reset($arr);//重置指標

while (list($key,$val)=each($arr)){
    echo $key.'=>'.$val.'</br>';
}
/*結果
  one=>1
  two=>2
  three=>3
 */

而foreach內建reset()函式,在呼叫完foreach的時候,系統指標就會重新指向第一個,因此不需要在foreach之前呼叫reset()函式!