php list、each函數遍歷數組

我們來研究兩個比較有趣的陣列函數。這兩個函數學起來不難。但是,有些同學會遇到一點點小困難。困難在於,找出list函數和each函數的操作特點。

list函數

#我們先來講list函數:

list ( mixed $變數1 [, mixed $變數n ] )

它的功能:將索引數組下標示為0的對應我變數1,下標1的對應變數2,依此類推。

我們來透過實驗來看一下:

<?php

list($one , $two , $three) = array('张三' ,'李四' ,'王五');

//再次声明:单引号不结释变量,所以输出的是字符串$one
echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>

我們來看看實驗結果:

QQ截图20161114132308.png

分析結果如圖:

document_2015-09-03_55e8466feae5c.png

結論:

    1.將下標為0的張三賦值為了$one

    2.將下標為1的李四賦值給了$two

    3.將下標為2的王五賦值給了$three

因此,我們知道了list的功能就是從左到右,一一對應索引數組從0開始的下標值。

list的另一個用法:

<?php

list( ,  , $three) = array('张三' ,'李四' ,'王五');

echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>

運行結果:

QQ截图20161114132428.png

#結論:

    1.list當中的第一、二放變數的地方留空,我只寫了$three。

    2.依照一一對應原則,張三和李四沒有變數可以對應。

    3.所以只有王五有變數對應

請嚴格記住:索引陣列的一一對應原則。 list第一個變數對應的是下標為0的陣列元素,下標為1的對應的是list裡面的第二個陣列元素。

請猜猜看下面的結果是多少? 為什麼?

<?php
list($one, $two, $three) = array(2 => '张三', '李四', '王五');
echo '$one----' . $one . '<br />';
echo '$two----' . $two . '<br />';
echo '$three----' . $three . '<br />';
?>

運行結果如下圖:

QQ截图20161114132543.png

總結:

    1.因為對應原則,$one找不到下標示為0的陣列元素,$two找不到下標為1的陣列元素,只有$three找到了下標為2的陣列元素

    3.在list($one, $two, $ three),我只寫了三個變數。對應完成,無需再對應後面的變數了,丟棄李四和王五。

each函數

each 函數的規律性上面就更有特點了,並且比較有趣。

array each ( array &$array )

功能:傳入一個陣列。它會將其中的一個元素拆為個新數組。每次執行這樣操作一個元素。執行一次先後移動一次,同樣的方式操作下一個陣列元素。執行到最後,返回false。

我們先來看看each是怎麼操作的陣列元素。

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   'pl'=>'五官端正',
   'type'=>'那就是女神',
   '我是吊丝不敢跟女神搭讪'
   ];

//第一次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';


?>

我們來看看第一次執行each的結果:

QQ截图20161114133313.png

#總結:
1.讀取了$kongjie中的第一個元素,將第一個元素('gao'=>'穿黑衣服的')分解開了。

    1分解後第一個元素變成了新陣列。

    2在新數組裡面,將原值(穿黑衣服的)放了索引下標1裡面,同時放到了關聯下標value裡面。

    3在新陣列裡面,將原鍵(gao),放到了關聯下標key裡面,放到了索引下標0裡面。

我們用圖來表示:

document_2015-09-03_55e84f4676360.png

這樣我們一下子就看明白了。

接下來我們說each的另外一個特性。讀一次,向後移動一個元素。

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   ];

//第一次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';


//第2次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

//第3次each【执行到了最后一个元素了】
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

//第4次【此时,后面已没有可操作的元素了,看返回什么】
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

?>

執行結果:

QQ截图20161114133417.png

總結:

    1.讀一次向後移動一次【可以想像有一個記錄的箭頭在移動】,將其中的每個元素拆解成一個新數組

    2.讀取到最後,沒有可操作的元素了,所以返回了false。

list 和each 配合

我們知道了list的特性,也知道了each的特性。那list是不是可以跟each配合起來一起完成一些工作呢?

list($key,$value) = each($array);

我們來看之前說到的這個圖:

11.png

而list中的第一個變數會去找索引下面0的元素去賦值,第二個變數會找索引下標為1的元素對變數賦值。

我們來看看下面範例:

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'腿特别长特别细',
   'mei'=>'好白',
   ];

list($key,$value) = each($kongjie);

echo $key. '-----' .$value .'<br />';

?>

運行結果如下:

QQ截图20161114133523.png

#總結:

    1.each把變數拆成了4個元素

    2.而list把0 =>gao 賦值給了變數$key

    3.list把1 => 穿黑衣服的賦值給了變數$value

each到最後會回傳false,因此我可以用布林型迴圈while來配合完成陣列的迴圈。

把上面的程式碼,輕輕一改就實現瞭如下效果:

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   ];

while(list($key,$value) = each($kongjie)){

   echo $key. '-----' .$value .'<br />';

}

?>

執行示範:

QQ截图20161114133617.png

##總結:

    1.循環一次,執行一次each,執行程式碼,然後向後移動一個元素

    2.執行到最後返回fasle,因此停止執行。

    3.可以透過each和list配合來達到foreach一樣的效果。

作業:

使用list和each配合,將如下數組:

<?php
$arr=array(
   '教学部'=>array(
       array('李某','18','人妖'),
       array('高某','20','男'),
       array('张某','21','妖人'),
   ),
   '宣传部'=>array(
       array('李某','18','人妖'),
       array('高某','20','男'),
       array('张某','21','妖人'),
   ),
   '财务部'=>array(
       array('李某','18','人妖'),
       array('高某','20','男'),
       array('张某','21','妖人'),
   ),
);
?>

遍歷顯示出來,效果如下:

44.png

繼續學習
||
<?php $arr=array( '教学部'=>array( array('李某','18','人妖'), array('高某','20','男'), array('张某','21','妖人'), ), '宣传部'=>array( array('李某','18','人妖'), array('高某','20','男'), array('张某','21','妖人'), ), '财务部'=>array( array('李某','18','人妖'), array('高某','20','男'), array('张某','21','妖人'), ), ); ?>