關聯課件:8子項目八 -數組函數(點擊在線預覽)
8.3.2 數 組 函 數
8.3.2.1 數組函數概述
錢員 &nbs如裡p; &nb東了sp; &nbs飛書p; 謝雜  了我; &nbs說是p; &nbs體體p;  姐還;
數組是編程中的重要元素,在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)一一講解其使用方法。下面(m好飛iàn)將(jiāng)著(zhe)重通麗講解其中最爲常用的幾個,其他函數讀者可以參考PHP手冊來學(xué)習其使用方法。有些讀者可能(néng)會(huì)來刀被(bèi)這(zhè)密密麻麻的物低函數吓倒,認爲學(xué)習PHP很難。實際上每一個學(xué)習者都(dōu)不可能(néng了鄉)把這(zhè)所有的函數都(dōu)記住。除了少量近也的極爲常用函數需要記住以外,其他大多數函數都(dōu)沒(年內méi)有必要去死記硬背。一種(zhǒng)比較好體湖(hǎo)的學(xué)習方法是將(ji北視āng)所有函數浏覽一遍,并大體記住其功能(néng)。等到編程中東個遇到類似問題時(shí),可以通過(guò)查找函數手冊找問場到函數的使用方法,然後(hòu)應用到程序中。實際上腦月很多編程語言的函數庫、類庫都(dōu)很龐大,兵男不可能(néng)短時(shí)間内全部掌握,都(dō山睡u)有一個逐漸熟悉、積累的過(guò)程。
下面(miàn)以幾個函數爲例來說(shuō)明數組處理函數的使用。
8.3.2.2 array()函數
array()函數用來建立一個新數組。函數的參數可以是一個混合類型。下面(水見miàn)看一個例子。
1: <!--文件8-1.php:用array()函數建立數組-->
2: <HTML>
3: &l問要t;HEAD>
4: 他爸  小有; <影技;TITLE>array函數的使用</TITLE>
5: &nbs女朋p; </HEAD>
6: &nb制朋sp; <BODY>
7:  劇理; &nb藍河sp; <?php飛離
8: &機物nbsp; &nbs員拿p; $arr1=array(0好關,1,2,3,4);
9: &nb鄉路sp;  書員; $arr2=array("a&離區quot;=>0,"b"=>1,&qu個又ot;c"=>2,"d"=>分紅;3,"e"放河;=>4);
10:  你木; &nb媽信sp; echo "$arr1[0]=".$arr1[0]懂房;
11: &nbs但物p; echo "<她近;br>";
12: &nb煙西sp; echo "$arr2[說煙"a"]=&quo爸哥t;.$arr2["a"];
13:  請門; ?&技風gt;
14: 玩討 </body>
15: </HTML&g討什t;
程序8-1.php中首先用array()函數定義了擁有5個元素的數組$arr1,并且每個元素分别賦值0,1,2,3,4。然後(hòu)定義了同樣(yàng)5個元素的數組$arr2,并分别賦值0,1,2,3,4。兩(liǎng)個數組的不同是第一個數組用了默認的數字作爲下标,第二個和店數組用了自定義的字符作爲下标。因此最後(hòu)輸出數組元素化長時(shí)也使用了各自對(duì)應的下得能标。程序的運行結果如圖8-3所示。
圖8-3 程序8-1.php的運行結果
8.3.2.3 count()函數
count()函數可以用來統計一個數組中元素的個數,在循術費環遍曆一個未知長(cháng)度的數妹笑組時(shí)非常有用。看下面(miàn)的例子。
1: <!--文件8-2.php:Count函數的使用-->
2: <HTML>
3: 說間 <HEAD>
4: &明地nbsp; 雪跳 <TITLE&為分gt;Count函數的使用</TITLE>
5: &nbs紅什p; </HEA秒窗D>
6: &nb門我sp; &n火志bsp; <BODY>
7: &nb錯線sp; &nb火購sp; <?php
8: &nb樹還sp; &nbs關金p; $arr相吃1=array(0,1,2,3靜筆,4);
9:  內身; &業土nbsp; &麗月nbsp;Echo "熱笑;數組$arr1中元素的個數爲:".count($ar學放r1);
10: 吧商 ?>火喝
11:  動大; </BODY>
12: <HTML>
程序運行後(hòu)將(jiāng)輸出:“數組$arr1中元素個數爲:5”。
8.3.2.4 each()函數
each()函數可以返回一個數組中當前元素的鍵和值,并將(ji訊湖āng)數組指針向(xiàng)前移動一步,數術常常被(bèi)用在循環中來遍曆一個數組。
1: <!--文件8-3.php:each函數的使用-->
2: <HTML>
3: <HEAD>
4:  月還; <TITLE>each函數的使用</TITLE>
5: </H匠拿EAD>
6: <BODY>內對;
7: &nb弟他sp; &nbs如跳p; <?php
8:  這通; &n木是bsp; $arr = array("黃少;name"=>"Bob"相音;,"age"=>20,&qu文個ot;sex"=>"male", "postcode&qu去如ot;= > &歌林nbsp; "100000"筆人);
9:  窗冷; 熱習 &nb關資sp; for($i=0;$i<c美到ount($arr);$i ){
10: 路服 樹外 &n相得bsp; 書離$keyAndValue=Each($arr);
11: &nb做答sp; 大土  也物; echo 銀線$keyAndValue["k報看ey"]."=>".$keyA物他ndValue["value"相關];
12:  爸煙; &n黃黃bsp;  視短; echo &藍錢quot;<br>";
13:  東們; }
14:  服明; &nb時技sp; ?>
15: &n跳月bsp; </BODY>
16: </HTML>
程序8-3.php中,首先定義了一個數組$arr,并且爲其賦值。值得注意的是,數組下标不是按順序遞增的數字,而是毫無男從規律的字符串。所以不能(néng)直接用一個遞電裡增的數字作爲下标來輸出,循環輸出遇到了困難。但是也地使用each()函數可以獲得這(zhè)個數組的下标以及下标對(duì)應的個近值,因此就(jiù)可以使用循環輸出到化每一個元素的下标和值。函數each($arr)將(jiāng)$arr數組中當前元素的下标和值都(dō也算u)存放到另外一個數組$kav中,然後(hòu)將(jiāng)數組指針指到下一可綠個元素。$kav數組的下标分别爲key和value。這(zhè)樣(yàng)隻城學需要調用$kav["key"]和$kav["value"]即可獲的該元素的下标和值。輸出這(zh子高è)兩(liǎng)個值後(hòu)本次循環結束,執行下一術近次循環,這(zhè)樣(yàng)又輸出了下一個元素的值,依此類推,整個數組都輛車(dōu)被(bèi)動态循環黑兵輸出了。程序的運行結果如圖8-4所示。
圖8-4 程序8-3.php的運行結果
1: <!--文件8-4.php:each函數的使用-->
2: <HTML>
3: <HEAD>
4: 藍文 &l多匠t;TITLE>each函數的使用</TITLE>
5: </HE就國AD>
6: <BODY>我新
7: 林都<?php
8: &nb務北sp; $arr = array ("name" = >現雨;"Bob", "age"=>2什山0, "sex"可請 = >"male&quo草醫t;, "postcode&quo為女t;=> "100000");
9: &報市nbsp; &道山nbsp; Whi下分le($kav=each($arr)){風少
10: &n中時bsp; 校爸 &西費nbsp;echo $kav["key音民"]."=>亮內;".$kav["val紙女ue"];
11: &n報靜bsp; &nbs為科p; echo "<br場房>";
12:  理新; &nbs物長p;  藍動;}
13:  坐森; ?>
14: </BODY>
15: </HTML>
程序8-4.php的代碼比程序8-3.php簡潔,實現的效果卻完全相同。例8-4利用了each()函數一個重要性質,那就(jiù)是當數組已經(jī日湖ng)到達末尾時(shí)each()函數返回false。通過(guò)前面(miàn)開森所學(xué)的知識,讀者知道(風唱dào)false是一個布爾值,表示“否”。因此它正好(hǎo)可以作爲我計while循環的結束條件。這(zhè)樣(yàng),可資上以用一個while循環來每次讀取$arr數組中的一個元素,不管數組有多少個元素,當指針到達末尾時(shí),船科each($arr)返回false,循環結束,程序執行完成(chéng)。為答同樣(yàng)實現了動态輸出未知長(cháng)度的數組的功能(né是道ng)。程序的運行結果如圖8-4所示。
通過(guò)例8-4.php也可以說(shuō)明,有時(得音shí)候實現同一個功能(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)一個數組。需要訪問數組中的某一元自拿素時(shí),隻需要將(jiāng)指針移動到該元素的位置,即可取出做離該元素,這(zhè)大大方便了用戶對(duì)數組的操作。下面(mià近明n)先詳細說(shuō)明這(zh東歌è)5個函數的作用,然後(hòu)通過(guò)一個例子來驗證其使相生用效果。
current():返回當前内部指針所指的元素的值。當到達數組末水服尾時(shí)返回false。
reset():將(jiāng)内部指針指向(xiàng)數組的第人媽一個元素,并返回其值。數組爲空時(shí少報)返回false。
end():將(jiāng)内部指針指向(xiàng)數組的最後遠子(hòu)一個元素,并返回其值。
next():將(jiāng)數組指針指向(xiàng)當前元素的下一個元素,并返回其值笑高。到達末尾時(shí)返回false。
prev():將(jiāng)數組指針指向(xiàng)當前元素的上一個元素,并返回身司其值,當到達頂端時(shí)返回false。
上面(miàn)5個函數的返回值均爲mixed類型,根據數組元素值的類型不同書醫而返回不同的類型。在這(zhè)裡(lǐ)要注意current()函數和next()函數的不同。他們雖然都(dōu)是取出一個元素值,但是current()并不移動指針。也就(jiù)是說(shuō)current()返回的是未移動指針之前所指向(xiàng)的元素的值,而next()返回的是移動指針之後(hòu)所指向(xià弟喝ng)的元素的值。下面(miàn)日空來看一個例子。
1: <!-雪厭-文件8-5.php:數組内部指針移動-->
2: <HTML>
3: <HEAD>
4: &化西nbsp; <TITLE>數組内部指針移動函數的綜合應用</TITLE>
5: <風飛;/HEAD>
6: &空慢nbsp; <BODY>
7: &習計nbsp;<?php
8: 視化 $arr=array(1,2,3,歌我4,5,6,7,8,9,10);
9: e些話cho "調用current():".current黑暗($arr);
10: &湖去nbsp; &校校nbsp;echo "<br>&quo算老t;;
11: &nb森就sp; 動說echo "再次調用current():".current($慢也arr);
12: &nbs白民p; echo &南去quot;<br>";
13: &n妹書bsp; echo "調用next():".n東分ext($arr);
14: &睡很nbsp; echo &鐘月quot;<br>";
15: &n相近bsp; echo "調用reset():".reset($arr)民文;
16: &錯高nbsp; &n家唱bsp; echo "<br>相師";
17: &nb站個sp; &n門暗bsp; echo "調用end():".en厭風d($arr);
18: &nb讀要sp; echo "<紙短br>";
19: &nb森自sp; &n厭行bsp; &照生nbsp; echo "調用prev():".prev($arr);
20:  中他; ?>
21: </BODY&飛懂gt;
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的數組函數,就(jiù)介紹到這(zh什土è)裡(lǐ)。表8-1中列出的其他函數,如果讀者感興趣可以自行編寫程序進(亮音jìn)行測試。函數的參數、返回值類型等均可以通過(guò)查看PHP手冊獲得。
compact()函數用于將(jiān工報g)兩(liǎng)個或多個變輛兒量轉換爲數組,當然也包含數組變量。其參數是變購小量的名稱而非帶有$全名。相反的函數是厭友extract()作用顧名思義就(jiù)是將(jiāng)數組轉換爲單人老個的字符串,鍵值作爲其字符串名線金稱,數組值作爲字符串的值。
each()函數的一個重要性質,那就(jiù)是當數組已經(jīng)到達笑朋末尾時(shí)each()函數返回f服長alse