關聯課件:8子項目八 -數組函數(點擊在線預覽)
8.3.2 數 組 函 數
8.3.2.1 數組函數概述
數組是編程中的重要元素,在PHP中也不例外。在PHP語法部分已經(jīng)介紹了數組的定義和使用,對(duì)數組有了一定了解。PHP中還(hái)爲用戶提供了一系列用來操作數組的函數,這(zhè)些函數爲标準函數,可以直接使用。表8-1列出了PHP5.1.6提供的數組函數。
看到這(zhè)個表讀者可能(néng)大吃一驚,PHP開(kāi)發(fā)者竟然提供了如此豐富的函數!實際上,PHP提供的數組操作函數多達110多個,表8-1中并未列出全部函數,而隻列出了其中較爲常用的函數。
即使是表中列出的函數,這(zhè)裡(lǐ)也不可能(néng)一一講解其使用方法。下面(miàn)將(jiāng)着重講解其中最爲常用的幾個,其他函數讀者可以參考PHP手冊來學(xué)習其使用方法。有些讀者可能(néng)會被這(zhè)密密麻麻的函數吓倒,認爲學(xué)習PHP很難。實際上每一個學(xué)習者都(dōu)不可能(néng)把這(zhè)所有的函數都(dōu)記住。除了少量的極爲常用函數需要記住以外,其他大多數函數都(dōu)沒(méi)有必要去死記硬背。一種(zhǒng)比較好(hǎo)的學(xué)習方法是將(jiāng)所有函數浏覽一遍,并大體記住其功能(néng)。等到編程中遇到類似問題時,可以通過(guò)查找函數手冊找到函數的使用方法,然後(hòu)應用到程序中。實際上很多編程語言的函數庫、類庫都(dōu)很龐大,不可能(néng)短時間内全部掌握,都(dōu)有一個逐漸熟悉、積累的過(guò)程。
下面(miàn)以幾個函數爲例來說明數組處理函數的使用。
8.3.2.2 array()函數
array()函數用來建立一個新數組。函數的參數可以是一個混合類型。下面(miàn)看一個例子。
1: <!--文件8-1.php:用array()函數建立數組-->
2: <HTML>
3: <HEAD>
4: <TITLE>array函數的使用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $arr1=array(0,1,2,3,4);
9: $arr2=array("a"=>0,"b"=>1,"c"=>2,"d"=>3,"e"=>4);
10: echo "$arr1[0]=".$arr1[0];
11: echo "<br>";
12: echo "$arr2["a"]=".$arr2["a"];
13: ?>
14: </body>
15: </HTML>
程序8-1.php中首先用array()函數定義了擁有5個元素的數組$arr1,并且每個元素分别賦值0,1,2,3,4。然後(hòu)定義了同樣5個元素的數組$arr2,并分别賦值0,1,2,3,4。兩(liǎng)個數組的不同是第一個數組用了默認的數字作爲下标,第二個數組用了自定義的字符作爲下标。因此最後(hòu)輸出數組元素時也使用了各自對(duì)應的下标。程序的運行結果如圖8-3所示。
圖8-3 程序8-1.php的運行結果
8.3.2.3 count()函數
count()函數可以用來統計一個數組中元素的個數,在循環遍曆一個未知長(cháng)度的數組時非常有用。看下面(miàn)的例子。
1: <!--文件8-2.php:Count函數的使用-->
2: <HTML>
3: <HEAD>
4: <TITLE>Count函數的使用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $arr1=array(0,1,2,3,4);
9: Echo "數組$arr1中元素的個數爲:".count($arr1);
10: ?>
11: </BODY>
12: <HTML>
程序運行後(hòu)將(jiāng)輸出:“數組$arr1中元素個數爲:5”。
8.3.2.4 each()函數
each()函數可以返回一個數組中當前元素的鍵和值,并將(jiāng)數組指針向(xiàng)前移動一步,常常被用在循環中來遍曆一個數組。
1: <!--文件8-3.php:each函數的使用-->
2: <HTML>
3: <HEAD>
4: <TITLE>each函數的使用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $arr = array("name"=>"Bob","age"=>20,"sex"=>"male", "postcode"= > "100000");
9: for($i=0;$i<count($arr);$i ){
10: $keyAndValue=Each($arr);
11: echo $keyAndValue["key"]."=>".$keyAndValue["value"];
12: echo "<br>";
13: }
14: ?>
15: </BODY>
16: </HTML>
程序8-3.php中,首先定義了一個數組$arr,并且爲其賦值。值得注意的是,數組下标不是按順序遞增的數字,而是毫無規律的字符串。所以不能(néng)直接用一個遞增的數字作爲下标來輸出,循環輸出遇到了困難。但是使用each()函數可以獲得這(zhè)個數組的下标以及下标對(duì)應的值,因此就可以使用循環輸出每一個元素的下标和值。函數each($arr)將(jiāng)$arr數組中當前元素的下标和值都(dōu)存放到另外一個數組$kav中,然後(hòu)將(jiāng)數組指針指到下一個元素。$kav數組的下标分别爲key和value。這(zhè)樣隻需要調用$kav["key"]和$kav["value"]即可獲的該元素的下标和值。輸出這(zhè)兩(liǎng)個值後(hòu)本次循環結束,執行下一次循環,這(zhè)樣又輸出了下一個元素的值,依此類推,整個數組都(dōu)被動态循環輸出了。程序的運行結果如圖8-4所示。
圖8-4 程序8-3.php的運行結果
通過(guò)程序8-4.php看到了each()函數的妙用。其實例8-3.php中的代碼還(hái)可以繼續簡化,也可以不用count()函數來統計數組元素的個數,也可以實現動态循環輸出一個未知長(cháng)度的數組。
1: <!--文件8-4.php:each函數的使用-->
2: <HTML>
3: <HEAD>
4: <TITLE>each函數的使用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $arr = array ("name" = >"Bob", "age"=>20, "sex" = >"male", "postcode"=> "100000");
9: While($kav=each($arr)){
10: echo $kav["key"]."=>".$kav["value"];
11: echo "<br>";
12: }
13: ?>
14: </BODY>
15: </HTML>
程序8-4.php的代碼比程序8-3.php簡潔,實現的效果卻完全相同。例8-4利用了each()函數一個重要性質,那就是當數組已經(jīng)到達末尾時each()函數返回false。通過(guò)前面(miàn)所學(xué)的知識,讀者知道(dào)false是一個布爾值,表示“否”。因此它正好(hǎo)可以作爲while循環的結束條件。這(zhè)樣,可以用一個while循環來每次讀取$arr數組中的一個元素,不管數組有多少個元素,當指針到達末尾時,each($arr)返回false,循環結束,程序執行完成(chéng)。同樣實現了動态輸出未知長(cháng)度的數組的功能(néng)。程序的運行結果如圖8-4所示。
通過(guò)例8-4.php也可以說明,有時候實現同一個功能(néng),可以選擇多種(zhǒng)途徑。作爲程序開(kāi)發(fā)人員,應該盡量選擇更加簡潔、高效的途徑。
8.3.2.5 current()、reset()、end()、next()和prev()函數
之所以要將(jiāng)這(zhè)5個函數并列起(qǐ)來介紹,是因爲這(zhè)5個函數的作用相似——它們都(dōu)用來操作數組内部的指針。在PHP中,使用一個内部指針來指向(xiàng)一個數組。需要訪問數組中的某一元素時,隻需要將(jiāng)指針移動到該元素的位置,即可取出該元素,這(zhè)大大方便了用戶對(duì)數組的操作。下面(miàn)先詳細說明這(zhè)5個函數的作用,然後(hòu)通過(guò)一個例子來驗證其使用效果。
current():返回當前内部指針所指的元素的值。當到達數組末尾時返回false。
reset():將(jiāng)内部指針指向(xiàng)數組的第一個元素,并返回其值。數組爲空時返回false。
end():將(jiāng)内部指針指向(xiàng)數組的最後(hòu)一個元素,并返回其值。
next():將(jiāng)數組指針指向(xiàng)當前元素的下一個元素,并返回其值。到達末尾時返回false。
prev():將(jiāng)數組指針指向(xiàng)當前元素的上一個元素,并返回其值,當到達頂端時返回false。
上面(miàn)5個函數的返回值均爲mixed類型,根據數組元素值的類型不同而返回不同的類型。在這(zhè)裡(lǐ)要注意current()函數和next()函數的不同。他們雖然都(dōu)是取出一個元素值,但是current()并不移動指針。也就是說current()返回的是未移動指針之前所指向(xiàng)的元素的值,而next()返回的是移動指針之後(hòu)所指向(xiàng)的元素的值。下面(miàn)來看一個例子。
1: <!--文件8-5.php:數組内部指針移動-->
2: <HTML>
3: <HEAD>
4: <TITLE>數組内部指針移動函數的綜合應用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $arr=array(1,2,3,4,5,6,7,8,9,10);
9: echo "調用current():".current($arr);
10: echo "<br>";
11: echo "再次調用current():".current($arr);
12: echo "<br>";
13: echo "調用next():".next($arr);
14: echo "<br>";
15: echo "調用reset():".reset($arr);
16: echo "<br>";
17: echo "調用end():".end($arr);
18: echo "<br>";
19: echo "調用prev():".prev($arr);
20: ?>
21: </BODY>
22: </HTML>
程序8-5.php中定義了一個數組$arr,并且用10個數字對(duì)其進(jìn)行了初始化。然後(hòu)分别調用上述5個函數來觀察其運行效果。爲了使輸出結果直觀,在每一次調用之後(hòu)都(dōu)輸出一個換行。程序運行結果如圖8-5所示。
圖8-5 程序8-5.php的運行結果
程序8-5.php中定義了一個數組$arr,并且用10個數字對(duì)其進(jìn)行了初始化。然後(hòu)分别調用上述5個函數來觀察其運行效果。爲了使輸出結果直觀,在每一次調用之後(hòu)都(dōu)輸出一個換行。程序運行結果如圖8-5所示。
下面(miàn)來分析程序的運行流程和對(duì)應的輸出結果:
1)數組初始化完成(chéng),内部指針指向(xiàng)第一個元素(元素值爲1)。
2)第一次調用current()函數,返回當前元素值1,指針不變。
3)再次調用current()函數,由于内部指針不變,仍然返回1。
4)調用next()函數,内部指針指向(xiàng)下一個元素,并返回其值(返回2)。
5)調用reset()函數,内部指針再次指向(xiàng)第一個元素,返回1。
6)調用end()函數,内部指針指向(xiàng)最後(hòu)一個元素,并返回其值(返回10)。
7)調用prev()函數,内部指針指向(xiàng)前一個元素,并返回其值(返回9)。
關于PHP的數組函數,就介紹到這(zhè)裡(lǐ)。表8-1中列出的其他函數,如果讀者感興趣可以自行編寫程序進(jìn)行測試。函數的參數、返回值類型等均可以通過(guò)查看PHP手冊獲得。
compact()函數用于將(jiāng)兩(liǎng)個或多個變量轉換爲數組,當然也包含數組變量。其參數是變量的名稱而非帶有$全名。相反的函數是extract()作用顧名思義就是將(jiāng)數組轉換爲單個的字符串,鍵值作爲其字符串名稱,數組值作爲字符串的值。
each()函數的一個重要性質,那就是當數組已經(jīng)到達末尾時each()函數返回false