php foreach遍歷關聯數組

foreach的基本語法

我們透過上一章的內容學會了遍歷連續下標的索引數組。可是,我們發現我們遍歷不了關聯數組,也遍歷不了下標不連續的索引數組。

那我們其實在學循環的時候,有一個布林型循環是專門用來循環陣列的。這個循環的基本語法就是foreach基本語法。

語法格式如下:

foreach( 要循环的数组变量 as [键变量 =>] 值变量){
//循环的结构体
}

#遍歷關聯陣列

這是固定用法,將要循環的陣列放進去。
as 是固定的關鍵字
後面的鍵變數是可選的,隨意定義一個變量,每次循環的時候,foreach這個語法會把鍵取出來賦值到鍵變量裡面
後面的值變數是必填的。每次循環的時候,會把值放到值變數裡面。

我們下面用程式碼來舉例子,加強對這個文法的理解。

<?php

$data = [
       'fj' => '凤姐',
       'fr' => '芙蓉',
   ];


foreach($data  as $key => $value){
       echo $key . '-------' . $value . '<br />';
}


//如果我们只想读取值的话,就可以把下面的$key => 给删除掉,读取的时候,就只读取值了。做完上面的实验,你可以打开下面的代码再实验几次。

/*
foreach($data  as  $value){
       echo  $value . '<br />';
}
*/
?>

我們執行一下看看結果:

QQ截图20161114131911.png

#透過上面的運行結果我們得到下面的結果:

# 1.每次循環的時候,把下標賦值給了變數$key,把值的變數賦值給了變數$value

    2.循環一次讀一次鍵和值。如上例中,讀完“鳳姐”再讀取“芙蓉”,讀到最後,發現沒有可以讀取的數組元素後,停止循環遍歷資料。

注意:$key 和$value並不是變數名必須得為這兩個名字。你命名為其他的也可以,如 $kai => $wen是一樣的。 你要清楚鍵賦值給了哪個變量,值賦值給了另外的哪個變數。

遍歷索引數組

foreach還挺好學的。因此,我們可以透過foreach遍歷連續的索引數組,如下例:

<?php

$data = array(
       0 => '中国',
       100 => '美国',
       20 => '韩国',
       300 => '德国',
   );

//待会儿可以自己做做实验,循环遍历一下下面的这个数组
//$data = array(1,2,3,4,5,6,7,8,9,10);


foreach($data as $k => $v){

   echo $k . '------' . $v .'<br />';

}

?>

運行看一下結果:

QQ截图20161114131954.png

##按照foreach的結果推理與剛剛做的關聯數組的結果是一樣的。

不同的是不連續的索引數組。每讀一次數組的元素,將當次循環的下標賦值給了變數$k,值賦值給了變數$v。每讀將鍵和值輸出,然後顯示出來。循環一次向後移動一次下標。讀取至最後,退出執行。

遍歷多維數組

數組當中還有一個數組我們該怎麼遍歷呢?我們來做一個實驗:

<?php

$data = array(

       0 => array(
           '中国' => 'china',
           '美国' => 'usa',
           '德国' => ' Germany',
       ),

       1 => array(
           '湖北' => 'hubei',
           '河北' => 'hebei',
           '山东' => 'shandong',
           '山西' => 'sanxi',
       ),

);

//注:我们在使用foreach循环时,第一次循环将键为0和键为1的两个数组赋值给一个变量($value)。然后,再套一个循环遍历这个$value变量,$value中的值取出来,赋值给$k和$v。

foreach($data as $value){

   //第一次循环把国家的数组赋值给了$value
   //第二次循环把中国的省份的数组又赋值给了$value
   //因此,我在循环的时候把$value再遍历一次

   foreach($value as $k => $v){
           echo $k . '-----' . $v .'<br />';
   }

   //为了看的更清晰,我在中间加上华丽丽的分割线方便你来分析

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

}

?>

結果就出來了喲:


#總結:

第一次迴圈的時候,將陣列賦值給了$value ,然後用foreach循環$value。將二維的子數組中的鍵給到$k,值賦值給變數$v。

第一次循環退出子陣列的循環,執行後續程式碼顯示分割線。

依此類推,第二次循環也是這樣。

作業

將如下數組:

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

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

QQ截图20161114132027.png

總結:

    1.第一次迴圈的時候,將陣列賦值給了$value,然後用foreach循環$value。將二維的子數組中的鍵給到$k,值賦值給變數$v。

    2.第一次循環退出子陣列的循環,執行後續程式碼顯示分割線。

    3.依此類推,第二次循環也是這樣。


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