第三章 數(shù)組
- 數(shù)組是一個(gè)可以存儲(chǔ)一組或一系列數(shù)值的變量
- 一個(gè)包含其他數(shù)組的數(shù)組稱為多維數(shù)組诗舰。
- 關(guān)聯(lián)數(shù)組允許使用更有意義的數(shù)據(jù)作為索引(也就是通常所說的數(shù)組下標(biāo))
1.數(shù)組 - 數(shù)組信息的整個(gè)集合可以作為一個(gè)單元進(jìn)行移動(dòng)
- 存儲(chǔ)在數(shù)組中的值稱為數(shù)組元素(value)
- 每個(gè)數(shù)組有一個(gè)相關(guān)的索引碉考,也成為關(guān)鍵字(key),其實(shí)就是平時(shí)所稱的數(shù)組下標(biāo)尘盼;可以用它來訪問元素。
- PHP允許間隔性的使用數(shù)字或字符串作為數(shù)組的索引输钩∫沓妫可以將數(shù)組的索引設(shè)置為傳統(tǒng)的數(shù)字型,也可以將索引設(shè)置為任何所希望的索引沉帮,這樣可以使得索引更有意義和有用锈死。。
2.數(shù)字索引數(shù)組
- array()實(shí)際上是一個(gè)語言結(jié)構(gòu)穆壕,而不是一個(gè)函數(shù)待牵。
- range()函數(shù)
- 如果需要按升序排列的數(shù)字保存在一個(gè)數(shù)組中,可以使用range()函數(shù)自動(dòng)創(chuàng)建數(shù)組喇勋。
- ranger()函數(shù)具有一個(gè)可選的第三個(gè)參數(shù)缨该,這個(gè)參數(shù)允許設(shè)定 值之間 的步幅
- 想要訪問一個(gè)變量的內(nèi)容,可以直接使用其變量名稱川背;如果該變量是一個(gè)數(shù)組贰拿,可以使用變量名稱和關(guān)鍵字或索引的組合來訪問其內(nèi)容蛤袒。
- 當(dāng)將數(shù)組或其他變量嵌入雙引號(hào)中的字符串時(shí),如果不能正確解釋它們膨更,可以將它們放置在雙引號(hào)之外妙真?
- PHP可以動(dòng)態(tài)調(diào)整數(shù)組的大小
3.使用不同索引的數(shù)組
- 在關(guān)聯(lián)數(shù)組中,可以將每個(gè)變量值與任何關(guān)鍵字或索引關(guān)聯(lián)起來荚守。通俗來說就是每個(gè)變量值都可以給予其專有的數(shù)組下標(biāo)珍德。
- 創(chuàng)建數(shù)組的三種方法:
(1)最常見也是使用最廣的方法。
$prices=array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
(2)下述代碼的意思先創(chuàng)建只有一個(gè)元素的數(shù)組$prices矗漾,然后再向其中添加額外的兩個(gè)元素锈候。
```
$prices=array('Tires'=>100);
$price['Oil']=10;
$price['Spark Plugs']=4;
(3)該種方法雖然寫法不同,但實(shí)際功能和上面是一樣的
$prices['Tires']=100;
$prices['Oil']=10;
$prices['Spark Plugs']=4;
- 循環(huán)語句
- foreach語句
- 該語句是專門用來循環(huán)數(shù)組的缩功。
- foreach語句
foreach($prices $key=>$value){
echo $key."-".$value."<br />";
}
- 意思是將\$prices數(shù)組中的索引(數(shù)組下標(biāo))保存在\$key中晴及,同時(shí)將數(shù)組的元素值保存到$value中,然后循環(huán)打印嫡锌。
- each()語句
- 該函數(shù)將放回?cái)?shù)組的當(dāng)前元素,并將下一個(gè)元素作為當(dāng)前元素琳钉。
```
while($element=each($prices)){
echo $element['key'];
echo "-";
echo $element['value'];
echo "<br />";
}
- \$elemente是一個(gè)數(shù)組势木。當(dāng)使用each()時(shí),它將返回一個(gè)帶有4個(gè)數(shù)值和4個(gè)指向數(shù)組位置的索引的數(shù)組;
- 位置key和0包含了當(dāng)前元素的關(guān)鍵字歌懒,而位置value和1包含了當(dāng)前元素的值啦桌。
- 所謂的4個(gè)數(shù)值和4個(gè)指向數(shù)組位置的索引如下圖所示:
- 
- list()語句
- 函數(shù)list()可以用來將一個(gè)數(shù)組分解為一系列的值。
```
while(list($product,$price)=echo($prices)){
echo "$product-$price<br/>";
}
```
- list函數(shù)通常和each函數(shù)共同使用及皂,先使用each()函數(shù)從\$prices數(shù)組中取出當(dāng)前元素甫男,并將其作為數(shù)組返回;然后再使用list()將從each()返回的數(shù)組中包含0验烧、1兩個(gè)元素變?yōu)閮蓚€(gè)名為\$product和\$price的新變量板驳。
- list()函數(shù)的最大優(yōu)點(diǎn)在于可以為新變量命名,使其更容易閱讀碍拆。
**4.數(shù)組操作符**
- 
- 聯(lián)合操作符是將\$b中的元素添加到\$a的末尾若治。如果\$b中的元素與\$a中的一些元素具有相同的索引(數(shù)組下標(biāo)),他們將不會(huì)被添加感混,也就是說$a中的元素將不會(huì)被覆蓋端幼。
**5.多維數(shù)組**
- 常見的二維數(shù)組形式:
`$products=array(array('TIR','Tires',100),array('OIL','Oil',10),array('SPK','Spark Plugs',4));`
- 與一維數(shù)組一樣,二維數(shù)組也可以自己命名列名稱來代替一般的索引數(shù)字弧满。
- 將所描述的內(nèi)容保存到用它的名稱命名的列中婆跑,會(huì)比將其保存到所謂的第一列中更容易記住庭呜;如上述代碼也可以改為:
$products=array(array('Code'=>'TIR,'Description'=>'Tires''Price'=>100),
array('Code'=>'OIL','Description'=>'Oil','Price'=>10),
array('Code'=>'SPK','Description'=>'Spark Plugs', 'Price'=>4));
- 同樣的也可以將`array('Code'=>'TIR,'Description'=>'Tires''Price'=>100),`前面的array進(jìn)行自定義命名滑进,*例如:*
```
$products=array('xxx'=>array('Code'=>'TIR','Description'=>'Tires','Price'=>100),
'yyy'=>array('Code'=>'OIL','Description'=>'Oil','Price'=>10),
'zzz'=>array('Code'=>'SPK','Description'=>'Spark Plugs', 'Price'=>4));
print_r ($products);
echo "<br /><br />".$products['zzz']['Description'];
- 
- 三維數(shù)組
- 三維數(shù)組具有高犀忱、寬、深的概念郊供;每個(gè)元素可以通過層峡碉、行和列進(jìn)行引用;例如:
$categories=array(
array(array('CAR_TIR','Tires',100),array('CAR_OIL','Oil',10),array('CAR_SPK','Spark Plugs',4)),
array(array('VAN_TIR','Tires',120),array('VAN_OIL','Oil',12),array('VAN_SPK','Spark Plugs',5)),
array(array('TRK_TIR','Tires',150),array('TRK_OIL','Oil',15),array('TRK_SPK','Spark Plugs',6))
);
- ***大多數(shù)的實(shí)際問題在邏輯上只需要使用三維或更少維的數(shù)組結(jié)構(gòu)就可以了***
**6.*數(shù)組排序**
- sort()函數(shù)
- 可以將數(shù)組按照升序進(jìn)行排序
- 該函數(shù)是區(qū)分字母大小寫的驮审。所有大寫字母都在小寫字母前面鲫寄,也就是說A<Z<a<z。
- 該函數(shù)第二個(gè)參數(shù)可選的疯淫;可以通過設(shè)定值來改變排序的行為:
- SORT_REGULAR - 正常比較單元(不改變類型)
- SORT_NUMERIC - 單元被作為數(shù)字來比較
- SORT_STRING - 單元被作為字符串來比較
- SORT_LOCALE_STRING - 根據(jù)當(dāng)前的區(qū)域(locale)設(shè)置來把單元當(dāng)作字符串比較地来,可以用 setlocale() 來改變。
- SORT_NATURAL - 和 natsort() 類似對(duì)每個(gè)單元以"自然的順序"對(duì)字符串進(jìn)行排序熙掺。 PHP 5.4.0 中新增的未斑。
- SORT_FLAG_CASE - 能夠與 SORT_STRING 或 SORT_NATURAL 合并(OR 位運(yùn)算),不區(qū)分大小寫排序字符串币绩。
- 指定排序類型的功能是非常有用的蜡秽。
- asort()函數(shù)與ksort()函數(shù)
- asort()函數(shù)就是根據(jù)數(shù)組的每個(gè)元素值(value)來進(jìn)行排序;
- ksort()函數(shù)就是根據(jù)關(guān)鍵字(key)排序缆镣。
```
$prices=array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
asort($prices);
echo "按照元素值(value)排序:<br/>";
print_r($prices);
echo "<br/><br/>";
ksort($prices);
echo "按照關(guān)鍵字(key)排序:<br/>";
print_r($prices);
- 
- 反向排序
- 和sort()芽突、asort()、ksort()雖然排序標(biāo)準(zhǔn)不同董瞻,但都是按照升序來排列寞蚌;
- 與之相對(duì)的rsort()、arsort()钠糊、krsort()則是將數(shù)組按照降序進(jìn)行排列挟秤。
$prices=array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
arsort($prices);
echo "按照元素值(value)排序:
";
print_r($prices);
echo "
";
krsort($prices);
echo "按照關(guān)鍵字(key)排序:
";
print_r($prices);
- 
**7.多維數(shù)組排序**
- *PHP是不能比較兩個(gè)數(shù)組間大小的,因此需要使用函數(shù)usort()告訴PHP如何比較各個(gè)元素抄伍。*
$products=array(array('CIR','Tires',100),
array('AIL','Oil',10),
array('SPK','Spark Plugs',4));
function compare($x , $y){
if($x[1] == $y[1]){
return 0;
}else if( $x[1] < $y[1]){
return -1;
}else {
return 1;
}
}
usort($products,'compare');
print_r($products);
- 
- \$x和\$y分別是\$products數(shù)組下的兩個(gè)子數(shù)組艘刚,所以\$x[1]是X子數(shù)組下的索引為1的元素值,\$y[1]是y子數(shù)組下的索引為1的元素值逝慧,然后\$x[1]與\$y[1]比大小昔脯。
- ***如果想要對(duì)數(shù)字比較大小,則compare()函數(shù)則可以改為:***
$products=array(array('CIR','Tires',100),
array('AIL','Oil',10),
array('SPK','Spark Plugs',4));
function compare($x , $y){
if($x[2] == $y[2]){
return 0;
}else if( $x[2] < $y[2]){
return -1;
}else {
return 1;
}
}
usort($products,'compare');
print_r($products);```
-
- 如果想要按照降序進(jìn)行排列:
$products=array(array('CIR','Tires',100),
array('AIL','Oil',10),
array('SPK','Spark Plugs',4));
function compare($x , $y){
if($x[2] == $y[2]){
return 0;
}else if( $x[2] < $y[2]){
return 1;
}else {
return -1;
}
}
usort($products,'compare');
print_r($products);
-
- 如果是關(guān)聯(lián)數(shù)組笛臣,既已經(jīng)給子數(shù)組的索引值進(jìn)行了自定義命名云稚,則進(jìn)行排序應(yīng)該按照定義的命名來輸入:
$products=array(array('Code'=>'TIR','Description'=>'Tires','Price'=>100),
array('Code'=>'OIL','Description'=>'Oil','Price'=>10),
array('Code'=>'SPK','Description'=>'Spark Plugs', 'Price'=>4));
function compare($x , $y){
if($x['Price'] == $y['Price']){
return 0;
}else if($x['Price'] < $y['Price']){
return -1;
}else {
return 1;
}
}
usort($products,'compare');
print_r($products);```
-

- 與一維數(shù)組排序一樣,多維數(shù)組如果需要對(duì)索引或值進(jìn)行排序時(shí):
- 對(duì)非數(shù)字索引數(shù)組的值進(jìn)行排序時(shí)沈堡,可以使用uasort()函數(shù)静陈;
- 對(duì)非數(shù)字索引數(shù)組的關(guān)鍵字進(jìn)行排序時(shí),可以使用uksort()函數(shù)。
**8.對(duì)數(shù)組進(jìn)行重新排序**
- shuffle()函數(shù)
- 該函數(shù)將數(shù)組更元素進(jìn)行隨機(jī)排序鲸拥。
- array_reverse()函數(shù)
- 將數(shù)組進(jìn)行逆序排列
- 其所返回的是原數(shù)組修改后的副本拐格,可以將其進(jìn)行覆蓋。
- array_push()函數(shù)
- 可以使用該函數(shù)將新元素添加到數(shù)組的末尾刑赶。
**9.文件載入數(shù)組**
-用PHP分離捏浊、格式化并顯示內(nèi)容

<?php
$orders=file("\$DOCUMENT_ROOT\/..\/orders\/orders.txt");
$numOrders=count($orders);
if($numOrders==0){
echo "<p><strong>No order pending.Please try again later.</strong></p>";
}
echo "<table border=\"1\">\r\n";
echo "<tr><th bgcolor=\"#ccccff\">Order Date</th>
<th bgcolor=\"#ccccff\">Tires</th>
<th bgcolor=\"#ccccff\">Oil</th>
<th bgcolor=\"#ccccff\">Spark Plugs</th>
<th bgcolor=\"#ccccff\">Total</th>
<th bgcolor=\"#ccccff\">Address</th>
</tr>";
for($i=0;$i<$numOrders;$i++){
$line=explode("\t",$orders[$i]);
$line[1]=intval($line[1]);
$line[2]=intval($line[2]);
$line[3]=intval($line[3]);
echo "<tr>
<td>".$line[0]."</td>
<td align=\"right\">".$line[1]."</td>
<td align=\"right\">".$line[2]."</td>
<td align=\"right\">".$line[3]."</td>
<td align=\"right\">".$line[4]."</td>
<td>".$line[5]."</td>
</tr>";
}
echo "</table>";
?>
-

- file()函數(shù)是把結(jié)果發(fā)送到一個(gè)數(shù)組中,文件中的每一行都將作為一個(gè)元素保存在該數(shù)組中撞叨。
- intval()函數(shù)可以將一個(gè)字符串轉(zhuǎn)化成一個(gè)整數(shù)金踪。
**10.其他數(shù)組操作**
- 瀏覽數(shù)組
- current()調(diào)用該數(shù)組將返回第一個(gè)元素。
- next()調(diào)用該函數(shù)是將指針遷移牵敷,然后再返回新的元素胡岔。
- 與each()函數(shù)的區(qū)別:
- each()函數(shù)是會(huì)先返回當(dāng)前元素,然后再將指針前移枷餐;
- next()函數(shù)則是先將指針前移靶瘸,然后返回新的元素。
- reset()和end()函數(shù):
- reset()函數(shù):返回指向數(shù)組的第一個(gè)元素的指針
- end()函數(shù):將指針移到數(shù)組末尾毛肋。
- reset()和end()函數(shù)可以分別返回指向數(shù)組的第一個(gè)和最后一個(gè)元素怨咪。
- prev()函數(shù):該函數(shù)與next()函數(shù)相反,是將當(dāng)前指針往回移一個(gè)位置然后再返回新的當(dāng)前元素润匙。
- ```
$array=range(1,10,2);
$value = end( $array);
while($value){
echo "$value<br />";
$value = prev($array);
}
- 
- array_walk()函數(shù)
- bool array_walk(array arr, string func, [mixed userdata])
- array_walk()函數(shù)要求聲明一個(gè)用戶自己的函數(shù)惊暴。
- 簡(jiǎn)單來說就是:對(duì)數(shù)組中的每個(gè)元素應(yīng)用用戶自定義函數(shù)。
- array_walk()函數(shù)的參數(shù):
- 第一個(gè)參數(shù)是arr,也就是需要處理的數(shù)組趁桃;
- 第二個(gè)參數(shù)是func,也就是用戶自定義并將作用于數(shù)組中每個(gè)元素的函數(shù)肄鸽;
- 第三個(gè)參數(shù)userdata是可選的卫病,如果使用它,它可以作為一個(gè)參數(shù)傳遞給用戶自己的函數(shù)典徘。
- 例子:
$array=range(1,10);
function my_multiply($value,$key,$factor){
$value *= $factor;
print_r($value);
echo "|";
}
array_walk($array,'my_multiply',3);
-

- 統(tǒng)計(jì)數(shù)組個(gè)數(shù)
- count()和sizeof()函數(shù)
- 兩個(gè)函數(shù)的用途相同蟀苛,都可以返回?cái)?shù)組元素的個(gè)數(shù)。
- 兩個(gè)函數(shù)都可以得到一個(gè)常規(guī)標(biāo)量變量中的元素個(gè)數(shù)逮诲,如果傳遞給該函數(shù)的數(shù)組是空數(shù)組帜平,則返回的數(shù)組元素個(gè)數(shù)為0。
- array_count_values()函數(shù)
- 該函數(shù)會(huì)統(tǒng)計(jì)每個(gè)特定的值在數(shù)組中出現(xiàn)過的次數(shù)梅鹦。
- 該函數(shù)會(huì)統(tǒng)計(jì)數(shù)組(\$array)會(huì)返回一個(gè)關(guān)聯(lián)數(shù)組(\$array1)裆甩,該關(guān)聯(lián)數(shù)組( \$array1 )中的關(guān)鍵字(\$array1的key)就是該數(shù)組(\$array)中的值(\$array的value);而該關(guān)聯(lián)數(shù)組(\$array1)中關(guān)鍵字(\$array1的key)對(duì)應(yīng)的數(shù)值(\$array1的value)則是關(guān)鍵字(\$array1的key)在該數(shù)組($array)中出現(xiàn)的次數(shù)(頻率)齐唆。
- ```
$array=array(4,5,1,2,3,4,1,2,3,5,5,2,3,4);
$ac=array_count_values($array);
print_r($ac);
- 
- extract()函數(shù)
extact(array var_array[, int extract_type][, string prefix]);
- 該函數(shù)針對(duì)非數(shù)字索引數(shù)組叨叙,將數(shù)組轉(zhuǎn)換成標(biāo)量變量。
- 該函數(shù)是創(chuàng)建一系列的標(biāo)量變量堪澎,這些變量的名稱必須是數(shù)組中關(guān)鍵字的名稱擂错,而變量值則是數(shù)組中的值。
- $key 對(duì)應(yīng) $var樱蛤;$value對(duì)應(yīng)value钮呀。
$array=array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
extract($array);`
echo "$key1 | $key2 | $key3;"
-

- extract_type參數(shù)
- 該函數(shù)將告訴extract()函數(shù)如何處理***關(guān)鍵字***沖突。
- EXTR_OVERWRITE:如果有沖突刹悴,覆蓋已有的變量行楞。
- EXTR_SKIP:如果有沖突,不覆蓋已有的變量土匀。
- EXTR_PREFIX_SAME:如果有沖突子房,創(chuàng)建一個(gè)名為$prefix_key的變量。必須提供prefix參數(shù)就轧。
- EXTR_PREFIX_ALL:給所有變量名加上前綴 prefix证杭。必須提供prefix參數(shù)。
- EXTR_PREFIX_INVALID:使用指定的prefix在可能無效的變量名稱錢加上前綴妒御。必須提供prefix參數(shù)解愤。
- EXTR_IF_EXISTS:只提取已經(jīng)存在的變量(換句話說,就是用數(shù)組中的值覆蓋已有的變量值)乎莉。這個(gè)參數(shù)對(duì)于數(shù)組到變量的轉(zhuǎn)換石非常有用送讲。
- 舉個(gè)例子,以下情況非常有用:定義一些有效變量惋啃,然后從 $_REQUEST 中僅導(dǎo)入這些已定義的變量哼鬓。
- EXTR_PREFIX_IF_EXISTS:只在不帶前綴的變量已經(jīng)存在的情況下,創(chuàng)建帶有前綴的變量边灭,其它的都不處理异希。
- EXTR_REFS:將變量作為引用提取。這有力地表明了導(dǎo)入的變量仍然引用了 var_array 參數(shù)的值绒瘦〕撇荆可以單獨(dú)使用這個(gè)標(biāo)志或者在 extract_type 中用 OR 與其它任何標(biāo)志結(jié)合使用。
- 如果沒有指定 extract_type惰帽,則被假定為 EXTR_OVERWRITE憨降。
- ```
$key1="value4";`
$array=array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
extract($array,EXTR_PREFIX_ALL,'my');
echo "$my_key3|$my_key2|$key1|$my_key1";
- 
- 以數(shù)字開始或包含空格的關(guān)鍵字將被跳過。
相關(guān)術(shù)語
1.語言結(jié)構(gòu)和函數(shù)
(1)相關(guān)概念
- 語言結(jié)構(gòu):就是PHP語言的關(guān)鍵詞善茎,語言語法的一部分券册;它不可以被用戶定義或者添加到語言擴(kuò)展或者庫(kù)中;它可以有也可以沒有變量和返回值。
- 函數(shù):由代碼塊組成的烁焙,可以復(fù)用航邢。從源碼的角度來說,也就是基于Zend引擎的基礎(chǔ)來實(shí)現(xiàn)的骄蝇,ext拓展庫(kù)中的函數(shù)都是這樣實(shí)現(xiàn)的膳殷。
(2)語言結(jié)構(gòu)為什么比函數(shù)快
- 原因是在PHP中,函數(shù)都要先被PHP解析器(Zend引擎)分解成語言結(jié)構(gòu)九火,所以有此可見赚窃,函數(shù)比語言結(jié)構(gòu)多了一層解析器解析。這樣就能比較好的理解岔激,什么語言結(jié)構(gòu)比函數(shù)快了勒极。
(3)語言結(jié)構(gòu)和函數(shù)的不同
語言結(jié)構(gòu)比對(duì)應(yīng)功能的函數(shù)快
語言結(jié)構(gòu)在錯(cuò)誤處理上比較魯棒,由于是語言關(guān)鍵詞虑鼎,所以不具備再處理的環(huán)節(jié)
語言結(jié)構(gòu)不能在配置項(xiàng)(php.ini)中禁用辱匿,函數(shù)則可以。
語言結(jié)構(gòu)不能被用做回調(diào)函數(shù)
(4)語言結(jié)構(gòu)列表
echo()
print()
die()
isset()
unset()
include()炫彩,注意匾七,include_once()是函數(shù)
require(),注意江兢,require_once()是函數(shù)
array()
list()
empty()
2.相對(duì)引用的位置問題
-
以引用圖片為例昨忆,如果需要引用的程序和被引用的圖片文件夾在平級(jí)則相對(duì)引用地址為
./images/1.jpg;
-
如果被引用的圖片文件夾比引用的程序高一級(jí),則相對(duì)引用地址為
../images/1.jpg;