1.數組的概念
數組就是一個用來存儲一系列變量值的命名區域。
每個數組元素有一個相關的索引(也成為關鍵字),它可以用來訪問元素。
PHP允許間隔性地使用數字或字符串作為數組的索引。
2.數字索引數組
2.1 數字索引數組的初始化
$products = array(‘Tires’,’Oil’,’Spark Plugs’);
如果需要將按升序排列的數字保存在一個數組中,可以使用range()函數自動創建這個數組。
創建一個1-10的數字數組:
$numbers = range(1,10);
可選的第三個參數允許設定值之間的步幅。
創建一個1-10之間的奇數數組:
$odds = range(1,10,2);
2.2 訪問數組的內容
默認情況下,0元素是數組的第一個元素,使用$products[0]、$products[1]、$products[2],就可以使用數組$products的內容了。
除了訪問,數組的內容可以修改和添加:
$products[3] = ‘Fuses’;
像PHP的其他變量一樣,數組不需要預先初始化或創建。在第一次使用它們的時候,它們會自動創建。
如下代碼創建了一個與前面使用array()語句創建的$products數組相同的數組:
$products[0] = ‘Tires’;$products[1] = ‘Oil’;$products[2] = ‘Spark Plugs’;
數組的大小將根據所增加的元素多少動態地變化。
2.3 使用循環訪問數組
就是遍歷數組:
foreach($products as $html' target='_blank'>current){ echo $current.” “;}
以上代碼將依次保存$current變量中的每一個元素并且打印它們。
3.使用不同索引的數組
在上面的$products數組中,允許PHP為每個元素指定一個默認的索引。這就意味著,所添加的第一個元素為元素0,第二個元素為1等。PHP還支持關聯數組。
3.1 初始化關聯數組
如下所示的代碼可以創建一個以產品名稱為關鍵字、以價格作為值的關聯數組:
$prices = array(‘Tires’=>100,’Oil’=>10,’Spark Plugs’=>4);
3.2 使用循環語句
因為關聯數組的索引不是數字,因此無法使用for循環語句對數組進行操作。但是可以使用foreach循環或list()和each()結構。
當使用foreach循環語句對關聯數組進行操作時,可以按如下方式使用關鍵字:
foreach($prices as $key => $value){ echo $key.” - ”.$value.”<br />”;}
如下所示的代碼將使用each()結構打印$prices數組的內容。
while($element = each($prices)){ echo $element[‘key’]; echo “ - ”; echo $element[‘value’]; echo “<br />”;}
在這段代碼中,變量$element是一個數組。當調用each()時,它將返回一個帶有4個數值和4個指向數組位置的索引的數組。位置key和0包含了當前元素的關鍵字,而位置value和1包含了當前元素的值。
除了以上兩種方式,函數list()可以用來將一個數組分解為一系列的值。
while(list($product,$price) = each($prices)){ echo “$product - $price<br />”; }
這個看起來挺高大上,使用each()從$prices數組中取出當前元素,并且將它作為數組返回,然后再指向下一個元素。還使用list()將從each()返回的數組中所包含0、1兩個元素變為兩個名為$product和$price的新變量。
三種輸出方式的結果相同:
注意,當使用each()函數時,數組將記錄當前元素。如果希望在相同的腳本中兩次使用該數組,就必須使用函數reset()將當前元素重新設置到數組開始處。要再次遍歷該數組,可以使用以下代碼:
reset($prices);while( list( $product, $price ) = each( $prices ))echo “$product - $price<br />”;
以上代碼可以將當前元素重新設置到數組開始處,因此允許再次遍歷數組。
4.數組操作符
其中聯合操作符(+)嘗試將$b中的元素添加到$a的末尾。如果$b中的元素與$a中的一些元素具有相同的索引,它們將不會被添加。即$a中的元素將不會被覆蓋。
5.多維數組
5.1 二維數組
$products = array( array( ‘TIR’, ‘Tires’, 100 ),array( ‘OIL’, ‘Oil’, 10 ),array( ‘SPK’, ‘Spark Plugs’, 4 ));
可以使用雙重for循環來訪問每個元素:
for($row = 0; $row < 3; $row++){ for($column = 0; $column < 3; $column++){ echo ‘|’.$products[$row][$column]; } echo ‘|<br />’;}
可以使用列名稱來代替數字。要保存產品的相同集合,可以使用如下代碼:
$products = array( array( ‘Code’=>’TIR’, ‘Description’=>’Tires’, ‘Price’=>100 ), array( ‘Code’=> ‘OIL’, ‘Description’=>’Oil’, ‘Price’=>10 ), array(‘Code’=>’SPK’, ‘Decription’=>’Spark Plugs’, ‘Price’=>4 ) );
如果希望檢索單個值,那么使用這個數組會容易得多。 使用描述性索引,不需要記住某個元素是存放在[x][y]位置的。使用一對有意義的行和列的名稱作為索引可以使你很容易找到所需的數據。
描述性索引的遍歷:
for( $row = 0; $row < 3; $row++ ){ while( list( $key, $value ) =each( $products[$row] ) ){ echo “|$value”; } echo ‘|<br />’;}
5.2 三維數組
三維數組是一個包含了數組的數組的數組。
$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_OLL','Oil',15), array('TRK_SPK','Spark Plugs',6) ));
遍歷:
for($layer = 0;$layer < 3;$layer++){ echo 'Layer $layer<br />'; for($row = 0;$row < 3;$row++){ for($column = 0;$column < 3;$column++){ echo '|'.$categories[$layer][$row][$column]; } echo '|<br />'; }}
根據創建多維數組的方法,可以創建四維、五維或六維數組。感興趣可以試下。
6.數組排序
6.1 使用sort()函數
sort()函數可以將數組按字母升序進行排序:
$products = array('LiLei','HanMeimei','Wo'); sort($products); foreach ($products as $key) { echo $key.' ';}
還可以按數字順序進行排序。需要注意的是,sort()函數是區分大小寫的。所有大寫字母都在小寫字母前面。
第二個參數可選,可指定排序類型:SORT_REGULAR(默認值)、SORT_NUMERIC或SORT_STRING。
6.2 使用asort()函數和ksort()函數對關聯數組排序
如果用關聯數組存儲各個項目和它們的價格,就需要用不同的排序函數使關鍵字和值在排序時仍然保持一致。
如下創建一個包含3個產品和價格的數組:
$prices = array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
函數asort()根據數組的每個元素值進行排序:
asort($prices);while(list($product,$price) = each($prices)){ echo '$product - $price<br />';}
而函數ksort()則是根據數組的每個關鍵字進行排序:
ksort($prices);while(list($product,$price) = each($prices)){ echo '$product - $price<br />';}
6.3 反向排序
即降序排序,與sort()、asort()、ksort()分別對應的是rsort()、arsort()、krsort()。
7.多維數組的排序
7.1 用戶定義排序
$products = array( array( 'TIR', 'Tires', 100 ), array( 'OIL', 'Oil', 10 ), array( 'SPK', 'Spark Plugs', 4 ));
自定義排序需要用函數usort()告訴PHP如何比較各個元素。為此需要編寫自己的比較函數。
如下所示對訂單數組中的第二列按字母進行排序:
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');for($row = 0; $row < 3; $row++){ for($column = 0; $column < 3; $column++){ echo '|'.$products[$row][$column]; } echo '|<br />';}
為了能夠被usort()函數使用,compare()函數必須比較$x和$y。如果$x等于$y,該函數必須返回0,如果$x小于$y,該函數必須返回負數,大于則返回正數。最后一句調用了內置函數usort(),該函數使用的參數分別是希望保存的數組($products)和比較函數的名稱(compare())。
如果要讓數組按另一種順序存儲,只要編寫一個不同的比較函數。
usort()中的“u”代表“user”,因為這個函數要求傳入用戶定義的比較函數。
7.2 反向用戶排序
用戶定義的排序沒有反向變體,但可以對一個多維數組進行反向排序。由于用戶應該提供比較函數,因此可以編寫一個能夠返回相反值的比較函數:
function reverse_compare($x, $y){ if($x[2] == $y[2]){ return 0; } else if($x[1] < $y[1]){ return 1; } else{ return -1; }}
8.對數組進行重新排序
shuffle()函數:將數組各元素進行隨機排序。
array_reverse()函數:給出一個原來數組的反向排序。
9.從文件載入數組
當前的訂單文件:
<?php//create short variable name$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];$orders= file('$DOCUMENT_ROOT/orders.txt');$number_of_orders = count($orders);if ($number_of_orders == 0) { echo '<p><strong>No orders pending. Please try again later.</strong></p>';}for ($i=0; $i<$number_of_orders; $i++) { echo $orders[$i].'<br />';}?>
還可以將訂單中的每個區段載入到單獨的數組元素中,從而可以分開處理每個區段或將它們更好地格式化。
用PHP分離、格式化顯示訂單內容:
<?php //create short variable name $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];?><html><head> <title>Bob's Auto Parts - Customer Orders</title></head><body><h3>Bob's Auto Parts</h3><h4>Customer Orders</h4><?php //Read in the entire file. //Each order becomes an element in the array $orders= file('$DOCUMENT_ROOT/orders.txt'); // count the number of orders in the array $number_of_orders = count($orders); if ($number_of_orders == 0) { echo '<p><strong>No orders pending. Please try again later.</strong></p>'; } echo '<table border='1'>'; 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<$number_of_orders; $i++) { //split up each line $line = explode(' ', $orders[$i]); // keep only the number of items ordered $line[1] = intval($line[1]); $line[2] = intval($line[2]); $line[3] = intval($line[3]); // output each order 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>';?></body></html>
這里使用了explode()函數來分隔每行,這樣在開始打印前就可以再做一些處理與格式化。在上一篇中,保存數據的時候使用了制表符作為定界符,因此,將按如下方式調用:
explode(“ ”,$orders[$i]);
可以使用許多方法從字符串中提取數字。這里使用了intval()函數,可以將一個字符串轉化成一個整數。
10.執行其他數組操作
10.1 在數組中瀏覽:each()、current()、reset()、end()、next()、pos()和prev()
如果創建一個新數組,那么當前指針就將被初始化,并指向數組的第一個元素。
調用current($array_name)將返回第一個元素。
調用next()或each()將使指針前移一個元素。其中調用each($array_name)會在指針前移一個位置之前返回當前元素。而調用next($array_name)先將指針前移,然后再返回新的當前元素。
reset()函數將返回指向數組第一個元素的指針。
end()函數將返回指向數組最后一個元素的指針。
prec()函數將當前指針回移一個位置然后再返回新的當前元素??墒褂胑nd()和prev()進行反向遍歷:
$array = array(7,8,9);$value = end($array);while($value){ echo '$value<br />'; $value = prev($array);}
10.2 對數組的每一個元素應用任何函數:array_walk()
array_walk()函數可以以相同方式使用或者修改數組中的每一個元素。
bool array_walk(array arr,string func,[mixed userdata])
array_walk()的第一個參數是需要處理的數組,第二個參數是用戶自定義并且將作用于數組中每個元素的函數。
第三個參數可以作為一個參數傳遞給自己的函數,可選。
10.3 統計數組元素的個數:count()、sizeof()和array_count_values()
count()函數和sizeof()函數都可以返回數組元素的個數。
調用array_count_values($array)將會統計每個特定的值在數組$array中出現過的次數(數組的基數集)。這個函數將返回一個包含頻率表的關聯數組。該數組包括關鍵字以及對應的出現次數。
10.4 將數組轉換成標量變量:extract()
函數extract()的作用是通過一個數組創建一系列的標量變量,這些變量的名稱必須是數組中關鍵字的名稱,而變量值則是數組中的值。
extract()函數具有兩個可選參數:extract_type和prefix。變量extract_type將告訴extract()函數將如何處理沖突。
兩個最常用的選項是EXTR_OVERWRITE(默認)和EXTR_PREFIX_ALL。
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');extract($array,EXTR_PREFIX_ALL,'my_prefix');echo '$my_prefix_key1 $my_prefix_key2 $my_prefix_key3';
可能你已經注意到了,extract()的關鍵字必須是一個有效的變量名稱才行,以數字開始或包含空格的關鍵字將被跳過。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答