PHP有很多關(guān)于數(shù)組的函數(shù)囱皿,方便數(shù)組操作兆旬。
定義
數(shù)組每個(gè)實(shí)體包含兩個(gè)項(xiàng):key和value必盖,可以通過(guò)查詢鍵來(lái)獲取其相應(yīng)的值赞咙。這些鍵可以是數(shù)值(numerical)鍵或關(guān)聯(lián)(associative)鍵普监。數(shù)值鍵與值沒(méi)有真正的聯(lián)系贵试,它們只是值在數(shù)組中的位置。
PHP提供了很多遍歷數(shù)組的方法凯正,無(wú)法使用關(guān)聯(lián)鍵還是數(shù)值鍵毙玻,都依賴于一種稱(chēng)為數(shù)組指針的特性。
創(chuàng)建數(shù)組
PHP不需要在創(chuàng)建數(shù)組時(shí)指定其大小廊散,因?yàn)镻HP是一種松散的語(yǔ)言桑滩,所以不需要在使用數(shù)組前先行聲明。盡管沒(méi)有限制允睹,PHP仍提供了正式和非正式的數(shù)組聲明方法运准。
引用PHP數(shù)組的各個(gè)元素,用一對(duì)中括號(hào)來(lái)指示缭受。數(shù)組沒(méi)有大小限制胁澳,所以只需建立引用就可以創(chuàng)建數(shù)組,例如:
$state[0]= ‘111'; $state[1]= ‘222';
如果索引值是數(shù)值索引而且是遞增的米者,還可以在創(chuàng)建時(shí)省略索引值韭畸。
$state[] =‘111'; $state[] =‘222';
可以使用array()創(chuàng)建數(shù)組,如:
$state =array(‘111', ‘222'); $state =array(‘one'=>'111', ‘two'=>'222');
使用list()提取數(shù)組,例如:
$state= array(‘one', ‘two', ‘three'); list($one,$two, $three) = $state;
數(shù)組內(nèi)的三個(gè)值分別賦給了$one, $two,$three, 可直接輸出。
用預(yù)定義的值范圍填充數(shù)組蔓搞,例如:
$num= range(1, 6); //類(lèi)似于$num =array(1, 2, 3, 4, 5, 6); 可選擇奇偶:$num =range(1, 6, 2);
//$num= array(1, 3, 5); 可選擇字母:$ch =range(“A”, “F”); //$ch= array(“A”, “B”, “C”, “D”, “E”, “F”);
輸出數(shù)組
輸出數(shù)組內(nèi)容最常用的方法就是迭代處理各個(gè)數(shù)組鍵胰丁,并輸出相應(yīng)的值。
foreach()函數(shù)可以很方便的遍歷一個(gè)數(shù)組喂分,得到每個(gè)value和key隘马。
print_r()函數(shù)很方便將數(shù)組的內(nèi)容輸出到屏幕上。prinf_r()函數(shù)接受一個(gè)變量妻顶,并將其內(nèi)容發(fā)送給標(biāo)準(zhǔn)輸出,成功時(shí)返回TRUE蜒车,否則返回FALSE讳嘱。
測(cè)試數(shù)組
通過(guò)is_array()函數(shù)知道某個(gè)特定變量是否一個(gè)數(shù)組。
is_array()函數(shù)確定某變量是否為數(shù)組酿愧,如果是則返回TRUE沥潭,否則返回FALSE。即使數(shù)組只包含一個(gè)值嬉挡,也將被認(rèn)為是一個(gè)數(shù)組钝鸽。
添加和刪除數(shù)組元素
PHP為擴(kuò)大和縮小數(shù)組提供了一些函數(shù)汇恤,對(duì)模仿各種隊(duì)列實(shí)現(xiàn)提供便利。
在數(shù)組頭添加元素:
array_unshift()函數(shù)在數(shù)組頭添加元素拔恰。所有已有的數(shù)值鍵都會(huì)相應(yīng)地修改因谎,以反映其在數(shù)組中的新位置,但是關(guān)聯(lián)鍵不受影響颜懊。
$state= array(‘11', ‘22', ‘33'); array_unshift($state,‘00'); //$state= array(‘00', ‘11', ‘22', ‘33');
在數(shù)組尾添加元素:
array_push()函數(shù)將值添加到數(shù)組的末尾财岔,添加新的值之后返回?cái)?shù)組中的元素總數(shù)。同時(shí)通過(guò)將這個(gè)變量作為輸入?yún)?shù)傳遞給此函數(shù)河爹,向數(shù)組壓入多個(gè)變量(元素)匠璧,其形式為:
$state= array(‘1', ‘2'); array_push($state,‘3'); //$state= array(‘1', ‘2', ‘3');
從數(shù)組頭刪除元素:
array_shift()函數(shù)刪除并返回?cái)?shù)組中找到的第一個(gè)元素。其結(jié)果是咸这,如果使用的是數(shù)值鍵夷恍,則所有相應(yīng)的值都會(huì)下移,而使用關(guān)聯(lián)鍵的數(shù)組不受影響媳维,其形式為:
$state= array(‘1', ‘2'); array_shift($state); //$state= array(‘2');
從數(shù)組尾刪除元素:
array_pop()函數(shù)刪除并返回?cái)?shù)組的最后一個(gè)元素酿雪,其形式為:
$state= array(‘1', ‘2'); array_pop($state); //$state= array(‘1');
定位數(shù)組元素
搜索數(shù)組:
in_array()函數(shù)在數(shù)組中搜索一個(gè)特定值,如果找到這個(gè)值則返回TRUE侨艾,否則返回FALSE执虹,其形式如下:
$user= array(‘111', ‘222', ‘333'); $str= ‘111'; if(in_array($str,$user)){ echo‘yes'; }else{ echo ‘no'; }
第三個(gè)參數(shù)strict可選,它強(qiáng)制in_array()在搜索時(shí)考慮類(lèi)型唠梨。
搜索關(guān)聯(lián)數(shù)組:
如果在一個(gè)數(shù)組中找到一個(gè)指定的鍵袋励,函數(shù)array_key_exists()返回TRUE,否則返回FALSE当叭。其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); if(array_key_exists('two',$arr)){ echo'yes';
}else{ echo‘no'; }
搜索關(guān)聯(lián)數(shù)組:
array_search()函數(shù)在一個(gè)數(shù)組中搜索一個(gè)指定的值茬故,如果找到則返回相應(yīng)的值,否則返回FALSE蚁鳖,其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); if(array_search('1',$arr)){ echo'yes'; }else{ echo‘no'; }
獲取數(shù)組鍵:
array_key()函數(shù)返回一個(gè)數(shù)組磺芭,其中包含所搜索數(shù)組中找到的所有鍵,其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); $keys= array_keys($arr); var_dump($keys); //array(3) {[0]=> string(3) "one" [1]=> string(3) "two" [2]=>string(5) "three" }
獲取數(shù)組值:
array_values()函數(shù)返回一個(gè)數(shù)組中的所有值醉箕,并自動(dòng)為返回的數(shù)組提供數(shù)組索引钾腺,其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); $values= array_values($arr); var_dump($values); //array(3) {[0]=> string(1) "1" [1]=> string(1) "2" [2]=>string(1) "3" }
遍歷數(shù)組
通常需要遍歷數(shù)組并獲得各個(gè)鍵或值(或者同時(shí)獲得鍵和值),PHP提供了一些函數(shù)來(lái)滿足需求讥裤。許多函數(shù)能完成兩項(xiàng)任務(wù)放棒,不僅能獲取當(dāng)前指針位置的鍵或值,還能將指針移向下一個(gè)適當(dāng)?shù)奈恢谩?/p>
獲取當(dāng)前數(shù)組鍵:
key()函數(shù)返回?cái)?shù)組中當(dāng)前指針?biāo)谖恢玫逆I己英,其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); $key= key($arr); var_dump($key); //string(3) "one"
注意:每次調(diào)用key()時(shí)不會(huì)移動(dòng)指針间螟。
獲取當(dāng)前數(shù)組值:
current()函數(shù)返回?cái)?shù)組中當(dāng)前指針?biāo)谖恢玫臄?shù)組值。其形式如下:
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); $value= current($arr); var_dump($value); //string(1)“1”
獲取當(dāng)前數(shù)組鍵和值:
each()函數(shù)返回?cái)?shù)組的當(dāng)前鍵/值對(duì),并將指針推進(jìn)一個(gè)位置厢破,其形式如下:
$arr =array('one'=>'1', 'two'=>'2', 'three'=>'3'); var_dump(each($arr)); //array(4) {[1]=> string(1) "1" ["value"]=> string(1)"1" [0]=> string(3) "one" ["key"]=>string(3)"one" ["key"]=>string(3) "one" }
返回的數(shù)組包含4個(gè)鍵荣瑟,鍵0和key鍵包含鍵名,而鍵1和value包含相應(yīng)的數(shù)據(jù)摩泪。如果執(zhí)行each()前指針位于數(shù)組末尾笆焰,則返回FALSE。
移動(dòng)數(shù)組指針
- 將指針移動(dòng)到下一個(gè)數(shù)組位置
next()函數(shù)返回緊接著放在當(dāng)前數(shù)組指針下一個(gè)位置的數(shù)組值加勤,如果指針本來(lái)就位于數(shù)組的最后一個(gè)位置仙辟,則返回FALSE
$arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); echo next($arr); //輸出2 echo next($arr); //輸出3
- 將指針移動(dòng)到前一個(gè)數(shù)組位置
prev()函數(shù)返回位于當(dāng)前指針前一個(gè)位置的數(shù)組值,如果指針本來(lái)就位于數(shù)組的第一個(gè)位置鳄梅,則返回FALSE
- 將指針移動(dòng)到第一個(gè)數(shù)組位置
reset()函數(shù)用于將數(shù)組指針設(shè)置回?cái)?shù)組的開(kāi)始位置叠国,如果需要在腳本中多次查看或處理一個(gè)數(shù)組,經(jīng)常使用這個(gè)函數(shù)戴尸,另外這個(gè)函數(shù)還經(jīng)常在排序結(jié)束時(shí)使用粟焊。
- 將指針移動(dòng)到最后一個(gè)數(shù)組位置
end()函數(shù)將指針移動(dòng)到數(shù)組的最后一個(gè)位置,并返回最后一個(gè)元素孙蒙。
向函數(shù)傳遞數(shù)組值:
array_walk()函數(shù)將數(shù)組中的各個(gè)元素傳遞到用戶自定義函數(shù)项棠。如果需要對(duì)各個(gè)數(shù)組元素完成某個(gè)特定動(dòng)作,這個(gè)函數(shù)將起作用挎峦。其形式如下:
functiontest($value ,$key){ echo$value.' '.$key.""; } $arr= array('one'=>'1', 'two'=>'2', 'three'=>'3'); array_walk($arr,'test'); //1 one //2 two //3 three
如果使用多維數(shù)組香追,PHP5中引入的array_walk_recursive()函數(shù)可以遞歸地對(duì)數(shù)組中的每一個(gè)元素應(yīng)用一個(gè)用戶定義函數(shù)。
確定數(shù)組大小和元素唯一性
確定數(shù)組的大刑菇骸:
count()函數(shù)返回?cái)?shù)組中值的總數(shù)
如果啟動(dòng)了可選的mode參數(shù)(設(shè)置為1)透典,數(shù)組將進(jìn)行遞歸計(jì)數(shù)統(tǒng)計(jì)元素。count(array(), 1);
注意:sizeof()函數(shù)是count()的別名顿苇。功能一致峭咒。
統(tǒng)計(jì)數(shù)組元素出現(xiàn)的頻率:
array_count_values()函數(shù)返回一個(gè)包含關(guān)聯(lián)鍵/值對(duì)的數(shù)組,其形式如下:
$arr= array('A', 'B', 'C', 'A'); $res= array_count_values($arr); print_r($res); //Array( [A] => 2 [B] => 1 [C] => 1 )
值表示出現(xiàn)的頻率纪岁。
確定唯一的數(shù)組元素:
array_unique()函數(shù)會(huì)刪除數(shù)組中所有重復(fù)的值凑队,返回一個(gè)由唯一值組成的數(shù)組,其形式如下:
$arr= array('A', 'B', 'C', 'A'); $res= array_unique($arr); print_r($res); //Array( [0] => A [1] => B [2] => C )
可選參數(shù)sort_flags(PHP5.2.9中新增)可以確定如何對(duì)數(shù)組鍵排序幔翰。默認(rèn)地漩氨,值會(huì)被作為字符串排序,不過(guò)也可以按數(shù)值對(duì)值排序(SORT_NUMERIC)遗增,或使用PHP默認(rèn)的排序方法(SORT_REGULAR)才菠,還可以根據(jù)本地化環(huán)境排序(SORT_LOCALE_STRING)。
數(shù)組排序
逆置數(shù)組元素排序
array_reverse()函數(shù)將數(shù)組中元素的順序逆置贡定,其形式如下:
$arr= array('A', 'B', 'C'); $res= array_reverse($arr); print_r($res); //Array( [0] => C [1] => B [2] => A )
如果可選參數(shù)preserve_keys設(shè)置為T(mén)RUE,則保持鍵映射可都,否則重新擺放后的各個(gè)值將對(duì)應(yīng)于先前該位置上的相應(yīng)鍵缓待。
$arr= array('A', 'B', 'C'); $res= array_reverse($arr, true); print_r($res); //Array( [2] => C [1] => B [0] => A )
置換數(shù)組鍵和值:
array_flip()函數(shù)將置換數(shù)組中鍵及其相應(yīng)值的角色蚓耽,其形式如下:
$arr= array('A', 'B', 'C'); $res= array_flip($arr); print_r($res); //Array( [A] => 0 [B] => 1 [C] => 2 )
數(shù)組排序
sort()函數(shù)對(duì)數(shù)組進(jìn)行排序,各元素按值由低到高的順序排列旋炒,其形式如下:
sort()函數(shù)不返回排序后的數(shù)組步悠,相反它只是“就地”對(duì)數(shù)組排序,不論結(jié)果如何都不返回任何值瘫镇。sort_flags參數(shù)可選鼎兽,將根據(jù)這個(gè)參數(shù)指定的值修改該函數(shù)的默認(rèn)行為。
SORT_NUMERIC铣除,按數(shù)值排序谚咬。對(duì)整數(shù)和浮點(diǎn)數(shù)排序很有用。
SORT_REGULAR尚粘,按照相應(yīng)的ASCII值對(duì)元素排序择卦。
SORT_STRING,按接近于人所認(rèn)知的正確順序?qū)υ嘏判颉?/p>
要保持初始鍵/值對(duì)應(yīng)條件下的數(shù)組排序需要用到asort()函數(shù)郎嫁。
assort()函數(shù)與sort()函數(shù)相同秉继,以升序?qū)?shù)組排序,只不過(guò)它將保持鍵/值的關(guān)聯(lián)泽铛,其形式如下:
$arr= array('C', 'B', 'A'); $res= $arr; print_r($arr); sort($arr); print_r($arr); asort($res); print_r($res); //Array ( [0]=> C [1] => B [2] => A ) Array ( [0] => A [1] => B [2] => C )Array ( [2] => A [1] => B [0] => C )
以逆序?qū)?shù)組排序
rsort()函數(shù)與sort()函數(shù)相同尚辑,只不過(guò)它以相反的順序(降序)對(duì)數(shù)組元素排序。
如果使用可選的sort_flags參數(shù)盔腔,具體的排序行為將由這個(gè)值確定杠茬。
保持鍵/值對(duì)的條件下以逆序?qū)?shù)組排序
與asort()一樣,arsort()函數(shù)會(huì)保持鍵/值的關(guān)聯(lián)铲觉,但是它以逆序?qū)?shù)組up
$arr= array('C', 'B', 'A', 'D'); arsort($arr); print_r($arr); //Array( [3] => D [0] => C [1] => B [2] => A )
如果使用可選的sort_flags參數(shù)澈蝙,具體的排序行為將由這個(gè)值確定。
數(shù)組自然排序
natsort()函數(shù)提供了一種相當(dāng)于人們平常使用的排序機(jī)制撵幽。
典型算法排序如下:
p1.jpg,p10.jpg, p2.jpg, p20.jpg
使用natsort()函數(shù)如下:
p1.jpg,p2.jpg, p10.jpg, p20.jpg
不區(qū)分大小寫(xiě)的自然排序
如:
Picture1.jpg,PICTURE10.jpg, picture2.jpg, picture20.jpg
按鍵值對(duì)數(shù)組排序
ksort()函數(shù)按鍵對(duì)數(shù)組排序灯荧,如果成功則返回TRUE,失敗將返回FALSE
以逆序?qū)?shù)組鍵排序
krsort()函數(shù)的操作與ksort()相同盐杂,也按鍵排序逗载,將以逆序排序。
根據(jù)用戶自定義規(guī)則排序
usort()函數(shù)提供了另一種排序方法链烈,可以使用在該函數(shù)中指定的用戶自定義比較算法對(duì)數(shù)組排序厉斟。如果需要以某種方法對(duì)數(shù)據(jù)排序,而PHP的任何內(nèi)置排序函數(shù)沒(méi)有提供相應(yīng)支持强衡,就需要該函數(shù)擦秽。
數(shù)組合并、拆分、接合和分解
合并數(shù)組
array_merge()函數(shù)將數(shù)組合并到一起感挥,返回一個(gè)聯(lián)合的數(shù)組缩搅。所得到的數(shù)組以第一個(gè)輸入數(shù)組參數(shù)開(kāi)始,按后面數(shù)組參數(shù)出現(xiàn)的順序依次追加触幼。其形式如下:
$arr= array('C', 'B', 'A', 'D'); $arr1= array('1', '2', '3', '4'); $arr2= array_merge($arr, $arr1); print_r($arr2); //Array( [0] => C [1] => B [2] => A [3] => D [4] => 1 [5] => 2 [6]=> 3 [7] => 4 )
遞歸追加數(shù)組
array_merge_recursive()函數(shù)與array_merge()相同硼瓣,可以將兩個(gè)或多個(gè)數(shù)組合并到一起,形成一個(gè)聯(lián)合的數(shù)組置谦。兩者之間的區(qū)別在于堂鲤,當(dāng)某個(gè)輸入數(shù)組中的某個(gè)鍵已經(jīng)存在于結(jié)果數(shù)組中時(shí)該函數(shù)會(huì)采取不同的處理方法。array_merge()會(huì)覆蓋前面存在的鍵/值對(duì)媒峡,將其替換為當(dāng)前輸入數(shù)組中的鍵/值對(duì)瘟栖,而array_merge_recursive()將兩個(gè)值合并在一起,形成一個(gè)新的數(shù)組并以原有的鍵作為數(shù)組名丝蹭。其形式為:
$arr= array('one'=>'C', 'one'=>'B'); $arr1= array('three'=>'1', 'one'=>'2'); $arr2= array_merge_recursive($arr, $arr1); print_r($arr2); //Array( [one] => Array ( [0] => B [1] => 2 ) [three] => 1 )
合并兩個(gè)數(shù)組
array_combine()函數(shù)會(huì)生成一個(gè)新數(shù)組慢宗,這個(gè)數(shù)組由一組提交的鍵和對(duì)應(yīng)的值組成,其形式為:
$arr= array('A', 'B'); $arr1= array('1', '2'); $arr2= array_combine($arr, $arr1); print_r($arr2); //Array( [A] => 1 [B] => 2 )
拆分?jǐn)?shù)組
array_slice()函數(shù)將返回?cái)?shù)組中的一部分奔穿,從鍵offset開(kāi)始镜沽,到offset+length位置結(jié)束。
offset為正值時(shí)贱田,拆分將從距數(shù)組開(kāi)頭的offset位置開(kāi)始;如果offset為負(fù)值缅茉,則拆分從距數(shù)組末尾的offset位置開(kāi)始。如果省略了可選參數(shù)length男摧,則拆分將從offset開(kāi)始蔬墩,一直到數(shù)組的最后一個(gè)元素。如果給出了length且為正數(shù)耗拓,則會(huì)在距數(shù)組開(kāi)頭的offset+length位置結(jié)束拇颅。相反,如果給出了length且為負(fù)數(shù)乔询,則在距數(shù)組開(kāi)頭的count(array) - |length|位置結(jié)束樟插。其形式如下:
$arr= array('A', 'B', 'C', 'D'); $arr1= array_slice($arr, 2, 1); print_r($arr1); //Array( [0] => C )
求數(shù)組的交集
array_intersect()函數(shù)返回一個(gè)保留了鍵的數(shù)組,這個(gè)數(shù)組只由第一個(gè)數(shù)組中出現(xiàn)的且在其他每個(gè)輸入數(shù)組中都出現(xiàn)的值組成竿刁。其形式如下:
$arr= array('A', 'B', 'C', 'D'); $arr1= array('A', 'B', 'E'); $arr2= array('A', 'F', 'D'); $arr3= array_intersect($arr, $arr1, $arr2); print_r($arr3); //Array( [0] => A )
注意:只有在兩個(gè)元素有相同的數(shù)據(jù)類(lèi)型時(shí)黄锤,array_intersect()才會(huì)認(rèn)為它們相等。
求關(guān)聯(lián)數(shù)組的交集
array_intersect_assoc()與array_intersect()基本相同食拜,只不過(guò)它在比較中還考慮了數(shù)組的鍵鸵熟。因此,只有在第一個(gè)數(shù)組中出現(xiàn)负甸,且在所有其他輸入數(shù)組中也出現(xiàn)的鍵/值對(duì)才被返回到結(jié)果數(shù)組中流强。其形式如下:
$arr= array('a'=>'A', 'b'=>'B', 'c'=>'C', 'd'=>'D'); $arr1= array('a'=>'A', 'c'=>'B', 'E'); $arr2= array('a'=>'A', 'b'=>'F', 'd'=>'B'); $arr3= array_intersect_assoc($arr, $arr1, $arr2); print_r($arr3); //Array( [a] => A )
求關(guān)聯(lián)數(shù)組的差集
函數(shù)array_diff_assoc()與array_diff()基本相同痹届,只是它在比較時(shí)還考慮了數(shù)組的鍵,因此打月,只在第一個(gè)數(shù)組中出現(xiàn)而不在其他輸入數(shù)組中出現(xiàn)的鍵/值對(duì)才會(huì)被返回到結(jié)果數(shù)組中短纵。其形式如下:
$arr= array('a'=>'A', 'b'=>'B', 'c'=>'C', 'd'=>'D'); $arr1= array('a'=>'A', 'b'=>'B', 'e'=>'E'); $arr3= array_diff_assoc($arr, $arr1); print_r($arr3); //Array( [c] => C [d] => D )
其他有用的數(shù)組函數(shù)
返回一組隨機(jī)的鍵
array_rand()函數(shù)將返回?cái)?shù)組中的一個(gè)或多個(gè)鍵。其形式為:
$arr= array('a'=>'A', 'b'=>'B', 'c'=>'C', 'd'=>'D'); $arr1= array_rand($arr, 2); print_r($arr1); //Array( [0] => b [1] => d )
隨機(jī)洗牌數(shù)組元素
shuffle()函數(shù)隨機(jī)地對(duì)數(shù)組元素重新排序僵控。
對(duì)數(shù)組中的值求和
array_sum()函數(shù)將數(shù)組內(nèi)的所有值加在一起,返回最終的和鱼冀,其形式如下:
$arr= array('A', 32, 12, 'B'); $count= array_sum($arr); print_r($count); //44
如果數(shù)組中包含其他數(shù)據(jù)類(lèi)型(例如字符串)报破,這些值將被忽略。
劃分?jǐn)?shù)組
array_chunk()函數(shù)將數(shù)組分解為一個(gè)多維數(shù)組千绪,這個(gè)多維數(shù)組由多個(gè)包含size個(gè)元素的數(shù)組所組成充易。其形式如下:
$arr= array('A', 'B', 'C', 'D'); $arr1= array_chunk($arr, 2); print_r($arr1); //Array( [0] => Array ( [0] => A [1] => B ) [1] => Array ( [0] => C [1]=> D ) )