|
PHP的一個(gè)優(yōu)勢(shì)就是提供了豐富的函數(shù),用來(lái)處理各種類(lèi)型的數(shù)據(jù)、完成一些相對(duì)復(fù)雜、經(jīng)常性、重復(fù)性多或者和底層有關(guān)的操作。這些函數(shù)都可以在程序中直接使用。從本章開(kāi)始,本書(shū)就為讀者介紹這些PHP內(nèi)置函數(shù)的用法。這一章主要講述一些和數(shù)組處理有關(guān)的常用PHP函數(shù)。 1 建立數(shù)組的方法 在第2章介紹數(shù)據(jù)類(lèi)型時(shí),已經(jīng)介紹過(guò)建立數(shù)組的方法。本節(jié)對(duì)建立數(shù)組的方法做進(jìn)一步的說(shuō)明。使用PHP的array()語(yǔ)言結(jié)構(gòu)可以創(chuàng)建一個(gè)數(shù)組,如下代碼所示。 $ms_office = array(“word”,”excel”,”outlook”,”access”); 上述代碼創(chuàng)建了一個(gè)名叫$ms_office的數(shù)組,它包含4個(gè)單元,每個(gè)單元存儲(chǔ)1個(gè)值,這些值是:word、excel、outlook和access,這些值也被稱(chēng)為數(shù)組元素。注意,這里的array()不是函數(shù),它只是PHP的語(yǔ)言結(jié)構(gòu)。 數(shù)組的索引又叫“鍵值”或者“下標(biāo)”。使用“=>”運(yùn)算符,可以為數(shù)組指定索引和值。它的語(yǔ)法格式是:“索引=>值”,每對(duì)“索引=>值”之間使用逗號(hào)“,”分開(kāi)。如下代碼使用“=>”為數(shù)組指定索引和值。 2 輸出數(shù)組元素的方法 在實(shí)際開(kāi)發(fā)中,經(jīng)常要訪問(wèn)數(shù)組的值。如果每次都按數(shù)組索引來(lái)取數(shù)值元素,會(huì)非常麻煩。在PHP中可以通過(guò)各種循環(huán)來(lái)快速訪問(wèn)數(shù)組元素。本節(jié)就介紹常用的for和foreach。 2.1 使用for循環(huán)語(yǔ)句輸出數(shù)組元素 對(duì)于一個(gè)按整數(shù)順序索引的數(shù)組,可以通過(guò)for循環(huán)語(yǔ)句,來(lái)依次訪問(wèn)數(shù)組元素, 
2.2 使用foreach循環(huán)語(yǔ)句輸出數(shù)組元素 PHP還專(zhuān)門(mén)為數(shù)組提供了一個(gè)循環(huán)語(yǔ)句:foreach循環(huán)語(yǔ)句,它的語(yǔ)法結(jié)構(gòu)如下所示。 foreach($array as $some_var) { statement } 其中foreach和as都是PHP關(guān)鍵字。該語(yǔ)法結(jié)構(gòu)的含義是:按順序,每次將數(shù)組$array中的一個(gè)元素存入變量$some_var后執(zhí)行statement語(yǔ)句,然后取下一個(gè)元素執(zhí)行statement語(yǔ)句,依次下去,直到所有元素都取到。和for循環(huán)語(yǔ)句一樣,statement可以是單條語(yǔ)句,也可以是一個(gè)語(yǔ)句塊。 2.3 使用print_r函數(shù)顯示數(shù)組元素 有時(shí),為了在程序中查看一個(gè)數(shù)組的結(jié)構(gòu)(即索引和值的對(duì)應(yīng)關(guān)系),需要將數(shù)組結(jié)構(gòu)顯示到頁(yè)面上。這可以通過(guò)PHP的print_r函數(shù)實(shí)現(xiàn)。 HTML中的“<pre>”和“</pre>”標(biāo)簽,可以把它們之間文本中的空格、回車(chē)、換行、tab鍵表現(xiàn)出來(lái),即按照文本原先的布局顯示。在代碼4-6中,調(diào)用函數(shù)print_r之后,也可以加上輸出結(jié)束標(biāo)簽“</pre>”的代碼。 3 計(jì)算數(shù)組元素個(gè)數(shù) 在PHP開(kāi)發(fā)中,經(jīng)常遇到對(duì)數(shù)組元素個(gè)數(shù)的計(jì)算,通常也稱(chēng)之為計(jì)算數(shù)組的大小。使用函數(shù)count計(jì)算數(shù)組元素的個(gè)數(shù),該函數(shù)語(yǔ)法如下所示。該函數(shù)的返回值為一整數(shù),即數(shù)組元素的個(gè)數(shù)。 int count(mixed $var); 上述語(yǔ)法格式中的“mixed”表示參數(shù)var可以是多種不同的數(shù)據(jù)類(lèi)型,這意味著,該函數(shù)不僅僅可以用來(lái)計(jì)算數(shù)組元素個(gè)數(shù)?!癿ixed”這種表示方法會(huì)在本書(shū)后續(xù)內(nèi)容中繼續(xù)使用。 4 對(duì)數(shù)組進(jìn)行分割、合并 數(shù)組的分割是指將一個(gè)數(shù)組拆分成一個(gè)或多個(gè)數(shù)組,而數(shù)組的合并,可以看成是分割的逆運(yùn)算,即將多個(gè)數(shù)組組合成一個(gè)新的數(shù)組。下面分別介紹和分割、合并數(shù)組有關(guān)的PHP內(nèi)置函數(shù)。 4.1 實(shí)現(xiàn)數(shù)組分割 使用函數(shù)array_chunk可以對(duì)一個(gè)數(shù)組進(jìn)行分割,該函數(shù)語(yǔ)法如下所示。 array array_chunk(array $input_array, int $size, bool $preserve_key); 該函數(shù)接受3個(gè)參數(shù),$input_array是將要分割的數(shù)組(即原數(shù)組),$size表示原數(shù)組被分割后,每個(gè)數(shù)組中元素的個(gè)數(shù),$preverse_key是可選參數(shù),它為T(mén)RUE時(shí),分割后的每個(gè)數(shù)組的索引使用原數(shù)組的索引名;它為FALSE時(shí),分割后的每個(gè)數(shù)組的索引都將使用從0開(kāi)始的整數(shù)索引。該函數(shù)的返回值是一個(gè)數(shù)組,這個(gè)數(shù)組的索引從0開(kāi)始,該數(shù)組的每個(gè)元素仍然是一個(gè)數(shù)組,即原數(shù)組被分割后的一個(gè)數(shù)組。 4.2 實(shí)現(xiàn)數(shù)組合并 使用函數(shù)array_merge可以合并一個(gè)或多個(gè)數(shù)組,該函數(shù)的語(yǔ)法如下所示。 array array_merge($array…); 該函數(shù)接受一個(gè)或多個(gè)數(shù)組作為參數(shù),PHP5中,它只接受array類(lèi)型的參數(shù)。該函數(shù)返回一個(gè)合并后的數(shù)組。 
4.5 處理數(shù)組元素和鍵值位置 PHP的每個(gè)數(shù)組內(nèi)部均會(huì)有一個(gè)指針,指向當(dāng)前元素。這里所謂的指針,可以把它理解成程序即將要處理的元素所在的位置。處理數(shù)組元素和鍵值(索引)的位置,就是獲取數(shù)組某個(gè)位置上的元素,或獲取該元素后,將該指針移動(dòng)到其他位置。PHP中,處理數(shù)組元素和鍵值位置的函數(shù)主要有以下幾個(gè)。 current:該函數(shù)返回?cái)?shù)組的當(dāng)前元素,不移動(dòng)當(dāng)前指針位置。 next:該函數(shù)返回當(dāng)前元素的下一個(gè)元素的值,并將指針向后移動(dòng)一位,下一個(gè)元素不存在時(shí),返回FALSE。 prev:該函數(shù)返回當(dāng)前元素的上一個(gè)元素的值,并將指針向前移動(dòng)一位,上一個(gè)元素不存在時(shí),返回FALSE。 end:該函數(shù)返回?cái)?shù)組的最后一個(gè)元素的值。 4.6 對(duì)數(shù)組進(jìn)行排序 對(duì)數(shù)組排序?qū)嶋H指的是對(duì)數(shù)組元素的排序。使用PHP的有關(guān)內(nèi)置函數(shù),可以對(duì)數(shù)組元素按多種方式進(jìn)行排序,下面分別介紹這些函數(shù)的用法。 4.6.1 使用sort對(duì)數(shù)組進(jìn)行排序 使用函數(shù)sort對(duì)數(shù)組元素按順向排序,即按字母由前向后或按數(shù)字由小到大排序。該函數(shù)的語(yǔ)法如下所示。 bool sort(array &$arr [,int $sort_flag]); 該函數(shù)接受一個(gè)數(shù)組作為輸入?yún)?shù),如果處理成功,該函數(shù)返回TRUE,否則,該函數(shù)返回FALSE。該函數(shù)將會(huì)刪除所要排序的數(shù)組原有的索引值,從而為該數(shù)組使用新的索引值。代碼4-11演示了如何使用該函數(shù)為數(shù)組元素排序。 4.6.2 使用rsort對(duì)數(shù)組進(jìn)行逆向排序 使用函數(shù)rsort對(duì)數(shù)組元素做逆向排序,即按字母從后到前或按數(shù)字由大到小排序。該函數(shù)的語(yǔ)法如下所示。 bool rsort(array &$arr [,int $sort_flag]); 該函數(shù)接受一個(gè)數(shù)組作為輸入?yún)?shù),如果處理成功,函數(shù)返回TRUE,否則返回FALSE。該函數(shù)將會(huì)刪除所要排序的數(shù)組原有的索引值,從而為該數(shù)組使用新的索引值。 4.6.3 排序時(shí)保持原數(shù)組的索引 前面介紹的兩個(gè)函數(shù)sort和rsort,都會(huì)為要排序的數(shù)組重新建立索引。有時(shí),對(duì)數(shù)組排序后,仍需要保持原數(shù)組的索引,對(duì)于這種情況,在PHP中可以使用如下兩個(gè)函數(shù)。 asort:該函數(shù)對(duì)數(shù)組元素進(jìn)行排序,并且保持?jǐn)?shù)組的原索引關(guān)系不變。該函數(shù)仍然對(duì)數(shù)組元素按順向排序。如果處理成功,該函數(shù)返回TRUE,否則返回FALSE。 ksort:該函數(shù)對(duì)數(shù)組元素按索引名順序排序,并且保持?jǐn)?shù)組的原索引關(guān)系不變,如果處理成功該函數(shù)返回TRUE,否則返回FALSE。該函數(shù)主要用于關(guān)聯(lián)數(shù)組。 4.6.4 數(shù)組的隨機(jī)排序 PHP提供一個(gè)隨機(jī)排序數(shù)組元素的函數(shù)shuffle(),該函數(shù)的語(yǔ)法如下所示。 bool shuffle (array $array) 該函數(shù)為參數(shù)數(shù)組$array中的元素賦予新的鍵名,這將刪除原有的鍵名而不僅僅是重新排序。如果執(zhí)行成功該函數(shù)返回TRUE。 4.6.5 數(shù)組的反向排序 本節(jié)最后,介紹一個(gè)可以將數(shù)組元素按原順序反向排序的函數(shù),該函數(shù)是array_reverse()。其語(yǔ)法如下所示。 array array_reverse (array $array [, bool $preserve_keys]) 該函數(shù)返回一個(gè)與原數(shù)組單元順序相反的數(shù)組,原數(shù)組以參數(shù)$array傳入該函數(shù),該函數(shù)的第2個(gè)參數(shù)是可選的,如果第2個(gè)參數(shù)$preserve_keys設(shè)置為T(mén)RUE,則原數(shù)組的鍵名將會(huì)被保留。 4.7 重置一個(gè)數(shù)組 PHP中,重置一個(gè)數(shù)組指的是,將數(shù)組中的內(nèi)部指針移動(dòng)到該數(shù)組的第一個(gè)元素所在的單元。使用函數(shù)reset可以完成對(duì)數(shù)組的重置。該函數(shù)的語(yǔ)法如下所示。 mixed reset(array &$arr); 該函數(shù)接受一個(gè)數(shù)組類(lèi)型的變量,將函數(shù)內(nèi)部指針指向數(shù)組第一個(gè)單元,并將第一個(gè)單元的元素返回。如果數(shù)組為空,該函數(shù)返回FALSE。 4.8 用數(shù)組對(duì)變量賦值 PHP中,可以將數(shù)組的元素作為值賦給變量,使用語(yǔ)言結(jié)構(gòu)list()可以完成這個(gè)功能。嚴(yán)格意義上講,list()和array()一樣,不是函數(shù)。 在上述程序中,通過(guò)list,將數(shù)組$planet的第一個(gè)元素’Earth’賦給了變量$no1,將第二個(gè)元素賦給了變量$no2,將第3個(gè)元素賦給了變量$no3。 4.9 快速創(chuàng)建數(shù)組 函數(shù)range()可以快速創(chuàng)建制定元素范圍的數(shù)組。其語(yǔ)法如下所示。 array range(mixed $low, mixed $high [, number $step]) 函數(shù)range()返回一個(gè)數(shù)組,其中元素為參數(shù)從$low到$high的序列,包括它們本身。例如range(1,9)相當(dāng)于array(1,2,3,4,5,6,7,8,9),如果$low>$high,則序列將從$high到$low。該函數(shù)的第3個(gè)參數(shù)$step是可選的,如果給出了step的值,它將被作為元素之間的跨度值。step應(yīng)該為正值。如果未指定,step則默認(rèn)為1。 4.10 壓入和彈出數(shù)組元素 這里所說(shuō)的壓入是指,向數(shù)組的末尾增加一個(gè)元素。而彈出是指,將數(shù)組中的最后一個(gè)元素取出。PHP提供兩個(gè)函數(shù)分別完成這兩個(gè)功能,這兩個(gè)函數(shù)是array_push()和array_poo()。 4.10.1 壓入數(shù)組元素 函數(shù)array_push()將一個(gè)或多個(gè)元素壓入數(shù)組的末尾,其語(yǔ)法如下所示。 int array_push(array $array, mixed $var) 該函數(shù)將參數(shù)$array當(dāng)成一個(gè)數(shù)據(jù)棧,并將傳入的參數(shù)$var壓入$array的末尾。array的長(zhǎng)度將根據(jù)入棧變量的數(shù)目增加,執(zhí)行正常時(shí),該函數(shù)返回?cái)?shù)組$array新的單元總數(shù)。 4.10.2 彈出數(shù)組元素 函數(shù)array_pop()將將數(shù)組最后一個(gè)元素彈出,其語(yǔ)法如下所示。 mixed array_pop(array $array) 該函數(shù)彈出并返回參數(shù)$array數(shù)組的最后一個(gè)單元,并將數(shù)組$array的長(zhǎng)度減一。如果參數(shù)$array為空(或者不是數(shù)組),該函數(shù)將返回 NULL。需要注意的是,使用本函數(shù)后會(huì)重置數(shù)組指針,相當(dāng)于使用了函數(shù)reset()。 4.11 改變數(shù)組字符索引名的大小寫(xiě) PHP提供了一個(gè)函數(shù),可以將以字符串作為數(shù)組索引(鍵名)的大小寫(xiě)全部更換,這個(gè)函數(shù)是array_change_key_case(),該函數(shù)的語(yǔ)法如下所示。 array array_change_key_case(array $input [, int $case]) 函數(shù)array_change_key_case()將參數(shù)$input數(shù)組中的所有索引改為全小寫(xiě)或大寫(xiě)??蛇x參數(shù)$case用來(lái)指定大小寫(xiě)轉(zhuǎn)換方式,它為兩個(gè)常量值:CASE_UPPER和CASE_LOWER。沒(méi)有指定該參數(shù)時(shí),該函數(shù)使用的默認(rèn)值是CASE_LOWER。 4.12 對(duì)數(shù)組的集合處理 函數(shù)array_intersect()可以用來(lái)計(jì)算數(shù)組的交集,其語(yǔ)法如下所示。 array array_intersect(array $arr1, array $arr2 [, $arr ...]) 函數(shù)array_intersect()返回一個(gè)數(shù)組,該數(shù)組包含了在參數(shù)數(shù)組$arr1中出現(xiàn),同時(shí)也出現(xiàn)在所有其它參數(shù)數(shù)組中的值,注意鍵名保留不變。 4.13 交換數(shù)組索引和元素 PHP中的數(shù)組可以通過(guò)函數(shù)實(shí)現(xiàn)索引和元素的交換,這對(duì)程序?qū)崿F(xiàn)某些操作帶來(lái)極大的便利,這個(gè)函數(shù)就是array_flip(),該函數(shù)的語(yǔ)法如下所示。 
4.14 快速填充數(shù)組元素 PHP提供函數(shù)快速填充數(shù)組,將數(shù)組中的某些或所有元素都置成通一個(gè)值,這個(gè)函數(shù)是array_fill(),其語(yǔ)法如下所示。 array array_fill(int $start, int $num, mixed $value) 函數(shù)array_fill()有3個(gè)參數(shù):其中參數(shù)$start指定要填充元素的開(kāi)始索引,參數(shù)$num表示將$num個(gè)數(shù)組元素以參數(shù)$value填充。 
4.15 統(tǒng)計(jì)數(shù)組元素出現(xiàn)次數(shù) 函數(shù)cout()用來(lái)計(jì)算整個(gè)數(shù)組元素的個(gè)數(shù),而函數(shù)array_count_values()用來(lái)統(tǒng)計(jì)數(shù)組中各元素出現(xiàn)的次數(shù),即數(shù)組中各元素的個(gè)數(shù)。函數(shù)array_count_values()的語(yǔ)法如下所示。 array array_count_values(array $arr) 該函數(shù)返回一個(gè)數(shù)組,這個(gè)數(shù)組把參數(shù)數(shù)組$arr中的元素作為索引,元素出現(xiàn)的次數(shù)作為對(duì)應(yīng)索引的值。 函數(shù)array_count_values()統(tǒng)計(jì)出數(shù)組$arr中,各個(gè)元素出現(xiàn)的次數(shù),而且從這個(gè)執(zhí)行結(jié)果可以看出,函數(shù)array_count_values()統(tǒng)計(jì)元素時(shí),是元素大小寫(xiě)的,比如Say和say會(huì)分別被統(tǒng)計(jì)。 4.16 檢查數(shù)組索引是否存在 PHP提供函數(shù)array_key_exists()檢查給定的索引是否存在于數(shù)組中,該函數(shù)語(yǔ)法如下所示。 bool array_key_exists(mixed $key, array $search) 該函數(shù)查找由參數(shù)$key指定的索引,是否存在于由參數(shù)$sarch指定的數(shù)組中,如果存在,該函數(shù)返回TRUE,否則或者出錯(cuò)時(shí),該函數(shù)返回FALSE。參數(shù)$key可以是任何能作為數(shù)組索引的值。 4.17 取得數(shù)組中的所有索引 PHP提供函數(shù)array_keys()用來(lái)獲取數(shù)組中所有的索引名,該函數(shù)語(yǔ)法如下所示。 array array_keys(array $arr [, mixed $search_value [, bool $strict]]) 該函數(shù)會(huì)將參數(shù)數(shù)組$arr中,所有的索引名返回到一個(gè)數(shù)組中。參數(shù)search_value是可選的,如果指定該參數(shù),則函數(shù)array_keys只返回該元素值對(duì)應(yīng)的索引名,可選參數(shù)$strict用來(lái)進(jìn)行全等比較。 4.18 用回調(diào)函數(shù)處理數(shù)組 PHP支持回調(diào)函數(shù)操作給定數(shù)組的元素上,這也是PHP數(shù)組函數(shù)的強(qiáng)大功能之一。函數(shù)array_map()就可以完成這樣的工作,它將回調(diào)函數(shù)作用到給定數(shù)組的元素上。其語(yǔ)法如下所示。 array array_map(callback_func, array $arr1 [, array ...]) 函數(shù)array_map()返回一個(gè)數(shù)組,該數(shù)組包含了參數(shù)$arr1中的所有元素經(jīng)過(guò)函數(shù)callback_func處理過(guò)之后的元素。callback接受參數(shù)的數(shù)目應(yīng)該和傳遞給array_map()函數(shù)的數(shù)組數(shù)目一致。 4.19 其他數(shù)組處理函數(shù) 這節(jié)介紹兩個(gè)在實(shí)際應(yīng)用中經(jīng)常會(huì)用到的兩個(gè)PHP內(nèi)置函數(shù):in_array()和key()。下面分別加以介紹。 in_array:該函數(shù)可以判斷某個(gè)值是否存在于數(shù)組中。如果在數(shù)組中找到該值,函數(shù)返回TRUE,否則返回FALSE。 key:該函數(shù)可以獲取數(shù)組中當(dāng)前單元的索引值。 4.19.1 判斷某個(gè)值是否存在于數(shù)組 代碼4-30演示了函數(shù)in_array的用法。 注意:從該執(zhí)行結(jié)果可以看出,in_array是區(qū)分大小寫(xiě)的?!癕ars”和“mars”被認(rèn)為是兩個(gè)不同的值。 
4.19.2 獲取數(shù)組中當(dāng)前單元的索引值 代碼(詳細(xì)內(nèi)容請(qǐng)參照本書(shū))演示了函數(shù)key的用法。這段程序首先將當(dāng)前指針指向數(shù)組的最后一個(gè)單元,然后通過(guò)函數(shù)key獲取當(dāng)前元素(即最后一個(gè)元素)的索引值。 
4.20 小結(jié) 本章介紹了對(duì)數(shù)組進(jìn)行處理的一些主要的PHP內(nèi)置函數(shù)和語(yǔ)言結(jié)構(gòu)。他們包括: 使用array創(chuàng)建數(shù)組。使用for、foreach等循環(huán)訪問(wèn)數(shù)組元素。使用函數(shù)count()計(jì)算數(shù)組元素個(gè)數(shù)。使用函數(shù)array_chunk()/array_merge()分割/合并數(shù)組。處理數(shù)組元素和鍵值位置的函數(shù)current()、prev()、next()、end()等。對(duì)數(shù)組元素排序的函數(shù)sort()、rsort()、asort()、ksort()等。使用reset()重置數(shù)組。使用list()將數(shù)組元素賦值給變量。使用函數(shù)shuffle()對(duì)數(shù)組元素進(jìn)行隨機(jī)排序??焖賱?chuàng)建數(shù)組的函數(shù)range()。使用函數(shù)array_push()、array_pop()壓入和彈出數(shù)組元素。 使用函數(shù)array_change_key_case()改變字符索引名的大小寫(xiě)。對(duì)數(shù)組做集合處理的函數(shù)array_intersect()、array_intersect_assoc()、 array_diff()和array_diff_assoc()。交換數(shù)組索引和元素的函數(shù)array_flip()??焖偬畛鋽?shù)組元素的函數(shù)array_fill()。使用函數(shù)array_count_values()統(tǒng)計(jì)數(shù)組元素出現(xiàn)的次數(shù)。使用函數(shù)array_key_exists()檢查索引是否存在。使用函數(shù)array_keys()取得數(shù)組中的所有索引。使用回調(diào)函數(shù)處理數(shù)組的函數(shù)array_map()。使用in_array()檢查數(shù)組中是否存在某值。使用key()獲取數(shù)組中當(dāng)前單元的索引值。本章介紹了較多關(guān)于處理數(shù)組的PHP函數(shù),讀者需要再實(shí)踐中慢慢掌握這些函數(shù)及其用法。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|