在PHP
中常常會用到foreach
的使用,而要用到foreach
,就必須用到數組。所以,在這篇文章中,咱們一邊講數組,一邊講foreach
。算法
foreach有兩種語法:數據庫
**第一種:**遍歷給定的 數組語句 array_expression
數組。每次循環中,當前單元的值被賦給 $value
而且數組內部的指針向前移一步(所以下一次循環中將會獲得下一個單元)。express
foreach (array_expression as $value) statement
第二種:同上,同時當前單元的鍵名也會在每次循環中被賦給變量 $key
。數組
foreach (array_expression as $key => $value) statement
下邊咱們一一來說解一下!函數
foreach
咱們先寫一個一維數組,以下:指針
$a = array('Tom','Mary','Peter','Jack');
一、咱們用第一種foreach方法來輸出。code
foreach ($a as $value) { echo $value."<br/>"; }
最後獲得的結果是:圖片
Tom Mary Peter Jack
二、咱們用第二種 foreach
方法來輸出。string
foreach ($a as $key => $value) { echo $key.','.$value."<br/>"; }
最後獲得的結果是:it
0,Tom 1,Mary 2,Peter 3,Jack
總結: 很明顯,咱們看到只是多了一個 $key
, 而這個 $key
的值就是序號 一、二、三、4 等等!
foreach
一維關聯數組以下:
$b = array('a'=>'Tom','b'=>'Mary','c'=>'Peter','d'=>'Jack');
也有人愛這麼寫,以下:
$b = array( 'a'=>'Tom', 'b'=>'Mary', 'c'=>'Peter', 'd'=>'Jack' );
一、咱們用第一種foreach
方法來輸出和上邊同樣。
foreach ($b as $value) { echo $value."<br/>"; }
最後獲得的結果是:
Tom Mary Peter Jack
二、咱們用第二種foreach
方法來輸出。
foreach ($b as $key => $value) { echo $key.','.$value."<br/>"; }
最後獲得的結果是:
a,Tom b,Mary c,Peter d,Jack
**總結: ** 很明顯,在一維關聯數組下, $key
就是關聯的序號,即相應的a、b、c、d。
foreach
遍歷二維數組時,稍微麻煩一些,爲何呢?由於遍歷出來的value
值,是一個數組,既然是數組,那麼就能夠對數組進行各類操做!
咱們先看一個基本的二維數組,以下:
$c = array( array('1','Tom'), array('2','Mary'), array('3','Peter'), array('4','Jack') );
一、咱們採用第一種 foreach
方法:
foreach ($c as $value) { print_r($value); echo "<br/>"; }
獲得這樣的結果:
Array ( [0] => 11 [1] => Tom ) Array ( [0] => 22 [1] => Mary ) Array ( [0] => 33 [1] => Peter ) Array ( [0] => 44 [1] => Jack )
二、咱們採用第二種foreach
方法:
foreach ($c as $key => $value) { echo '$key='.$key."<br/>"; print_r($value); echo "<br/>"; }
獲得以下的結果:
$key=0 Array ( [0] => 11 [1] => Tom ) $key=1 Array ( [0] => 22 [1] => Mary ) $key=2 Array ( [0] => 33 [1] => Peter ) $key=3 Array ( [0] => 44 [1] => Jack )
總結:由上可知,基本二維數組,$key
就是序號 ,如 0\1\2\3 等等!
#4、關聯二維數組 與 foreach
說明,關聯二維數組在實際項目中,用到的可多了。爲何?通常數據庫提取出來的數據都是關聯二維數組,學會了關聯二維數組,就在PHP的實戰中,已經掌握了很大一部分了!
那麼先列出關聯二維數組,以下:
$d = array( array('id'=>'11','name'=>'Tom'), array('id'=>'22','name'=>'Mary'), array('id'=>'33','name'=>'Peter'), array('id'=>'44','name'=>'Jack') );
一、用第一種方法代碼:
foreach ($d as $value) { print_r($value); echo "<br/>"; }
獲得的結果以下:
Array ( [id] => 11 [name] => Tom ) Array ( [id] => 22 [name] => Mary ) Array ( [id] => 33 [name] => Peter ) Array ( [id] => 44 [name] => Jack )
很明顯,關聯與不關聯的區別就是:不關聯前邊是 0/1
等等,而關聯顯示具體名稱 id/name
等等。
二、用第二種方法的代碼:
foreach ($d as $key => $value) { echo '$key='.$key."<br/>"; print_r($value); echo "<br/>"; }
獲得的結果以下:
$key=0 Array ( [id] => 11 [name] => Tom ) $key=1 Array ( [id] => 22 [name] => Mary ) $key=2 Array ( [id] => 33 [name] => Peter ) $key=3 Array ( [id] => 44 [name] => Jack )
**總結:**這裏$key仍然是 0/1/2/3 。
#5、項目中實戰應用
說明:在項目中,數組的變化好多,固然foreach
功不可沒!固然也能夠用while、each等等方法,可是foreach
最爲方便了!下邊簡要說一下幾個常見的項目實戰!
仍是第四列出關聯二維數組,以下:
$d = array( array('id'=>'11','name'=>'Tom'), array('id'=>'22','name'=>'Mary'), array('id'=>'33','name'=>'Peter'), array('id'=>'44','name'=>'Jack') );
如今咱們只要 name
一列的內容,固然咱們能夠用如下的方法來實現,
foreach ($d as $key => $value) { echo ($value['name']); echo "<br/>"; }
但有時候咱們不得不將之列爲一個一維數組,因而咱們就有了如下的方法:
//獲取name列做爲一維數組 $nameArr = array(); //name列 foreach ($d as $key => $value) { $nameArr[] = $value['name']; } print_r($nameArr);
以上經過賦空數組值,foreach 這個空數組等於咱們的值,就獲得了一個新的數組!以上代碼的結果以下:
Array ( [0] => Tom [1] => Mary [2] => Peter [3] => Jack )
這個數組明顯是:一維普通數組,以下:
$d = array('Tom','Mary','Peter','Jack');
好了,將二維關聯數組變爲一維普通數組就寫到了這裏!
很明顯,咱們從數據庫中取出來的數據就是一個二維數組,並且是二維關聯數組。那麼,咱們怎麼取出父分類?怎麼取出對應父分類的子分類呢?
首先要說明的是:幾乎全部的分類都是一個數據庫模式,所以咱們十分有必要了解它的結構,還有怎麼取出對應的數據!
對於二級分類,爲了說明方便,我從網上找一個比較好說明的例子,那就是「新聞分類「!
好了,廢話很少說,開始正題!咱們先寫一個數組。
//從數據庫中取出的分類數據 $original_array = array( array('id' => 1,'pid' => 0,'name' => '新聞分類'), array('id' => 2,'pid' => 0,'name' => '最新公告'), array('id' => 3,'pid' => 1,'name' => '國內新聞'), array('id' => 4,'pid' => 1,'name' => '國際新聞'), array('id' => 5,'pid' => 0,'name' => '圖片分類'), array('id' => 6,'pid' => 5,'name' => '新聞圖片'), array('id' => 7,'pid' => 5,'name' => '其它圖片') );
同時,數據庫是這個樣子的。
說明:數據庫的分類就是這個樣子的!取出來的數組也是這個樣子的!通常這樣子的!
//從數據庫中取出的分類數據 $original_array = array( array( 'id' => 1, 'pid' => 0, 'name' => '新聞分類' ), array( 'id' => 2, 'pid' => 0, 'name' => '最新公告' ), array( 'id' => 3, 'pid' => 1, 'name' => '國內新聞' ), array( 'id' => 4, 'pid' => 1, 'name' => '國際新聞' ), array( 'id' => 5, 'pid' => 0, 'name' => '圖片分類' ), array( 'id' => 6, 'pid' => 5, 'name' => '新聞圖片' ), array( 'id' => 7, 'pid' => 5, 'name' => '其它圖片' ) );
那麼首先咱們得知道咱們想要的結果是什麼樣子呢?這一點:咱們必要知道!(之前我對這方面瞭解比較不深,又經常使用開源程序,所以致使我不怎麼會寫這方面了)
咱們最終想要的結果是這樣子的!(不怕你們笑話,這一點我請一個朋友幫的忙才解決的!)
//整理後的分類數據 $output_array = array( array( 'id' => 1, 'pid' => 0, 'name' => '新聞分類', 'children' => array( array( 'id' => 3, 'pid' => 1, 'name' => '國內新聞' ), array( 'id' => 4, 'pid' => 1, 'name' => '國際新聞' ), ), ), array( 'id' => 2, 'pid' => 0, 'name' => '最新公告', ), array( 'id' => 5, 'pid' => 0, 'name' => '圖片分類', 'children' => array( array( 'id' => 6, 'pid' => 5, 'name' => '新聞圖片' ), array( 'id' => 7, 'pid' => 5, 'name' => '其它圖片' ), ), ), );
很明顯,這裏數組多了一個字段,就是 children
!
那麼,怎麼 從 $original_array
變爲 $output_array
呢?這裏有我一個朋友作的函數,固然也用到 foreach
!
函數以下:
//整理函數 /** * 生成無限級樹算法 * @author Baiyu 2014-04-01 * @param array $arr 輸入數組 * @param number $pid 根級的pid * @param string $column_name 列名,id|pid父id的名字|children子數組的鍵名 * @return array $ret */ function make_tree($arr, $pid = 0, $column_name = 'id|pid|children') { list($idname, $pidname, $cldname) = explode('|', $column_name); $ret = array(); foreach ($arr as $k => $v) { if ($v [$pidname] == $pid) { $tmp = $arr [$k]; unset($arr [$k]); $tmp [$cldname] = make_tree($arr, $v [$idname], $column_name); $ret [] = $tmp; } } return $ret; }
那們怎麼使用呢?
//整理函數的使用 $output_array = make_tree($original_array);
完整使用方法以下:
$output_array =make_tree($arr, 0, 'id|pid|children')
函數以後,咱們這樣調用就獲得了一級分類與二級分類!
foreach ($output_array as $key => $value) { echo '<h2>'.$value['name'].'</h2>'; foreach ($value['children'] as $key => $value) { echo $value['name'].','; }
結果以下:
附:$output_array
這個數組,咱們使用print_r
,就能夠獲得以下的結果!
Array ( [0] => Array ( [id] => 1 [pid] => 0 [name] => 新聞分類 [children] => Array ( [0] => Array ( [id] => 3 [pid] => 1 [name] => 國內新聞 [children] => Array ( ) ) [1] => Array ( [id] => 4 [pid] => 1 [name] => 國際新聞 [children] => Array ( ) ) ) ) [1] => Array ( [id] => 2 [pid] => 0 [name] => 最新公告 [children] => Array ( ) ) [2] => Array ( [id] => 5 [pid] => 0 [name] => 圖片分類 [children] => Array ( [0] => Array ( [id] => 6 [pid] => 5 [name] => 新聞圖片 [children] => Array ( ) ) [1] => Array ( [id] => 7 [pid] => 5 [name] => 其它圖片 [children] => Array ( ) ) ) ) )