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 $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>
<h1>Bob's Auto Parts</h1>
<h2>Customer Orders</h2>
<?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\">\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<$number_of_orders; $i++) {
//split up each line
$line = explode("\t", $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(“\t”,$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()函數將當前指針回移一個位置然後再返回新的當前元素。可使用end()和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常用數組函數小結
1.將數組的鍵名全部轉換成小寫和大寫的函數是什麼? 答:array_change_key_case($array [,CASE_LOWER|CASE_UPPER])
2.創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值的函數是什麼? 答: array array_combine ( array $keys , array $values )
3.統計數組中所有的值出現的次數的函數是什麼? 答: array array_count_values ( array $input )
4.返回數組中部分的或所有的鍵名的函數是什麼? 答:array array_key($array [,$search_value [,true|false]])
5.將回調函數作用到給定數組的單元上的函數是什麼? 答: array array_map ( callable $callback , array $arr1 [, array $... ] )
6.合並一個或多個數組的函數是什麼? 答: array array_merge ( array $array1 [, array $... ] )
7.將數組最後一個元素彈出的函數是什麼? 答: mixed array_pop ( array &$array )
8.將一個或多個單元壓入數組的末尾(入棧)的函數是什麼? 答: int array_push ( array &$array , mixed $var [, mixed $... ] )
9.從數組中隨機取出一個或多個單元的函數是什麼? 答: mixed array_rand ( array $input [, int $num_req = 1 ] )
10.返回一個單元順序相反的數組的函數是什麼? 答: array array_reverse ( array $array [, bool $preserve_keys = false ] )
11.在數組中搜索給定的值,如果成功則返回相應的鍵名的函數是什麼? 答: array_search ( mixed $needle , array $haystack [, $strict = false ] )
12.將數組開頭的單元移出數組的函數是什麼? 答: mixed array_shift ( array &$array )
13.移除數組中重復的值的函數是什麼? 答: array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )
14.在數組開頭插入一個或多個單元的函數是什麼? 答: int array_unshift ( array &$array , mixed $var [, mixed $... ] )
15.返回數組中所有的值的函數是什麼? 答: array array_values ( array $input )
16.對數組進行逆向排序並保持索引關系的函數是什麼? 答: bool arsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
17.對數組進行正向排序並保持索引關系的函數是射門? 答: bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
18.返回數組中當前的鍵/值對並將數組指針向前移動一步的函數是什麼? 答: array each ( array &$array ),例如:while(list($key,$value)=each($array)){}
19.對數組按照鍵名逆向排序的函數是什麼? 答: bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
20.對數組按照鍵名正向排序的函數是什麼? 答: bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
21. 對數組逆向排序的函數是什麼? 答: bool rsort ( array &$array [, int = SORT_REGULAR ] )
22.對數組正向排序的函數是什麼? 答: bool sort ( array [, int = SORT_REGULAR ] )
23.將數組打亂的函數是什麼? 答: bool shuffle ( array )
24. count() 的別名函數是什麼? 答:sizeof()
非數組,也非NULL,通通返回1
<?php
$arr=array('春','夏','秋','冬');
echo count($arr);//4
echo '<br/>';
$str='false';
echo count($str);//1
echo '<br/>';
$res=null;
echo count($res);//0
echo "<br/>";
$arr=array('春','夏','秋','冬',array('a','b','c'));
echo count($arr),'<br/>';//5
echo count($arr,1),'<br/>';//第2個參數為1時,代表遞歸的來計算數組的單元個數
$arr=array('春','夏','秋','冬',array('a',array('b','c')));
echo count($arr,1),'<br/>';
?>
range函數
作用:建立一個包含指定范圍單元的數組
返回值:返回的數組中從 start 到 limit 的單元,包括它們本身。
<?php
$arr=range(0,20);
foreach($arr as $v){
echo $v.'<br/>';
}
$arr=range(0,20,2);
foreach($arr as $k=>$v){
echo $k.'###'.$v.'<br/>';
}
?>
array_flip函數 array array_flip ( array $trans )
作用:交換鍵值
參數:array $trans 要交換鍵/值對的數組。
返回值:成功時返回交換後的數組,如果失敗返回 NULL。鍵值對調後,出現2個相同的鍵,後面的會覆蓋前面的鍵
<?php
$arr=array('a'=>1,'b'=>2,'c'=>3);
print_r($arr);//Array ( [0] => a [1] => b [2] => c )
print_r(array_flip($arr));//Array ( [a] => 0 [b] => 1 [c] => 2 )
?>
array_sum函數 number array_sum ( array $array )
作用:計算數組中所有值的和,將數組中的所有值的和以整數或浮點數的結果返回。
參數:array 輸入的數組。
返回值:所有值的和以整數或浮點數的結果返回
<?php
$arr=range(1,100);
print_r($arr);
echo array_sum($arr);
?>
shuffle函數 bool shuffle ( array &$array )
作用: 將數組打亂
參數:array 待操作的數組
返回值:成功時返回 TRUE, 或者在失敗時返回 FALSE。該函數是引用傳值
<?php
$arr=range(1,100);
print_r($arr);
echo array_sum($arr);
if(shuffle($arr)){
echo '打亂成功';
print_r($arr);//
}
?>
array_reverse函數 array array_reverse ( array $array [, bool $preserve_keys = false ] )
作用:接受數組 array 作為輸入並返回一個單元為相反順序的新數組。
參數:array 輸入的數組。preserve_keys 如果設置為 TRUE 會保留數字的鍵。 非數字的鍵則不受這個設置的影響,總是會被保留。
返回值:返回反轉後的數組。
<?php
$arr = array('a'=>'春','b'=>'夏','c'=>'秋','d'=>'冬');
print_r($arr); //Array ( [a] => 春 [b] => 夏 [c] => 秋 [d] => 冬 )
print_r(array_reverse($arr)); //Array ( [d] => 冬 [c] => 秋 [b] => 夏 [a] => 春 )
$arr = array('春','夏','秋','冬');
print_r($arr);
print_r(array_reverse($arr));
print_r(array_reverse($arr,true));
?>
array_push函數 int array_push ( array &$array , mixed $var [, mixed $... ] )
作用:將一個或多個單元壓入數組的末尾(入棧)
參數:array 輸入的數組。 var 要壓入的值。
返回值:返回處理之後數組的元素個數。
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>
array_pop函數 mixed array_pop ( array &$array )
作用:將數組最後一個單元彈出(出棧)
參數:array 需要做出棧的數組。
返回值:返回 array 的最後一個值。如果 array 是空(如果不是一個數組),將會返回 NULL 。
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>
array_shift函數 mixed array_shift ( array &$array )
作用:將數組開頭的單元移出數組
參數:array 輸入的數組。
返回值:返回移出的值,如果 array 為 空或不是一個數組則返回 NULL。
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
?>
array_unshift函數 int array_unshift ( array &$array , mixed $var [, mixed $... ] )
作用:在數組開頭插入一個或多個單元
參數:array 輸入的數組。 var 開頭插入的變量。
返回值:返回 array 數組新的單元數目。
<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>