PHP陣列中的陣列實際上是一個有序圖。圖是一種把 values 對映到 keys 的型別。此型別在很多方面做了優化,因此可以把它當成真正的陣列來使用,或列表(向量),散列表(是圖的一種實現),字典,集合,棧,佇列以及更多可能性。因為可以用另一個 php 陣列作為值,也可以很容易地模擬樹。
定義陣列 array()
可以用 array() 語言結構來新建一個 array。它接受一定數量用逗號分隔的 key => value 引數對。
array( [key =>]value , ... )// key 可以是 integer 或者 string// value 可以是任何值
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar
echo $arr[12]; // 1
?>
key 可以是 integer 或者 string。如果鍵名是一個 integer 的標準表達方法,則被解釋為整數(例如 "8" 將被解釋為 8,而 "08" 將被解釋為 "08")。key 中的浮點數被取整為integer。php 中沒有不同的數字下標和關聯下標陣列,陣列的型別只有一種,它可以同時包含整型和字串型的下標。
值可以是任何值。
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
?>
如果對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆蓋。
2
陣列可以分為三種類型
數值陣列:帶有數字 ID 鍵的陣列
關聯陣列:陣列中的每個 ID 鍵關聯一個值
多維陣列:包含一個或多個數組的陣列
3
數值陣列
數值陣列儲存的每個元素都帶有一個數字 ID 鍵。可以使用不同的方法來建立數值陣列:
例子 1
在這個例子中,會自動分配 ID 鍵:
$names = array("Peter","Quagmire","Joe");
例子 2
在這個例子中,我們人工分配的 ID 鍵:
$names[0] = "Peter"; $names[1] = "Quagmire"; $names[2] = "Joe";
可以在指令碼中使用這些 ID 鍵:
$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";
echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors";
?>
以上程式碼的輸出:
Quagmire and Joe are Peter's neighbors
4
關聯陣列
關聯陣列,它的每個 ID 鍵都關聯一個值。在儲存有關具體命名的值的資料時,使用數值陣列不是最好的做法。通過關聯陣列,我們可以把值作為鍵,並向它們賦值。
例子 1
在本例中,我們使用一個數組把年齡分配給不同的人:
$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);
例子 2
本例與例子 1 相同,不過展示了另一種建立陣列的方法:
$ages['Peter'] = "32"; $ages['Quagmire'] = "30"; $ages['Joe'] = "34";
可以在指令碼中使用 ID 鍵:
$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";
echo "Peter is " . $ages['Peter'] . " years old.";
?>
以上指令碼的輸出:
Peter is 32 years old.
5
多維陣列
在多維陣列中,主陣列中的每個元素也是一個數組。在子陣列中的每個元素也可以是陣列,以此類推。
例子 1
在本例中,我們建立了一個帶有自動分配的 ID 鍵的多維陣列:
$families = array
(
"Griffin"=>array
(
"Peter",
"Lois",
"Megan"
),
"Quagmire"=>array
(
"Glenn"
),
"Brown"=>array
(
"Cleveland",
"Loretta",
"Junior"
)
);
如果輸出這個陣列的話,應該類似這樣:
Array
(
[Griffin] => Array
(
[0] => Peter
[1] => Lois
[2] => Megan
)
[Quagmire] => Array
(
[0] => Glenn
)
[Brown] => Array
(
[0] => Cleveland
[1] => Loretta
[2] => Junior
)
)
例子 2
讓我們試著顯示上面的陣列中的一個單一的值:
echo "Is " . $families['Griffin'][2] . " a part of the Griffin family?";
以上程式碼的輸出:
Is Megan a part of the Griffin family?
6
還有很多可以運算元組的函式,下面為大家列舉一些,後期到高階PHP再詳細講解。
一、陣列操作的基本函式1.1、陣列的鍵名和值array_values($arr); 獲得陣列的值array_keys($arr); 獲得陣列的鍵名array_flip($arr); 陣列中的值與鍵名互換(如果有重複前面的會被後面的覆蓋)in_array("apple",$arr); 在陣列中檢索applearray_search("apple",$arr); 在陣列中檢索apple ,如果存在返回鍵名array_key_exists("apple",$arr); 檢索給定的鍵名是否存在陣列中isset($arr[apple]): 檢索給定的鍵名是否存在陣列中1.2、陣列的內部指標current($arr); 返回陣列中的當前單元pos($arr); 返回陣列中的當前單元key($arr); 返回陣列中當前單元的鍵名prev($arr); 將陣列中的內部指標倒回一位next($arr); 將陣列中的內部指標向前移動一位end($arr); 將陣列中的內部指標指向最後一個單元reset($arr; 將陣列中的內部指標指向第一個單元each($arr); 將返回陣列當前元素的一個鍵名/值的構造陣列,並使陣列指標向前移動一位list($key,$value)=each($arr); 獲得陣列當前元素的鍵名和值1.3、陣列和變數之間的轉換extract($arr);用於把陣列中的元素轉換成變數匯入到當前檔案中,鍵名當作變數名,值作為變數值注:(第二個引數很重要,可以看手冊使用)使用方法 echo $a;compact(var1,var2,var3);用給定的變數名建立一個數組二、陣列的分段和填充2.1、陣列的分段array_slice($arr,0,3); 可以將陣列中的一段取出,此函式忽略鍵名array_splice($arr,0,3,array("black","maroon")); 可以將陣列中的一段取出,與上個函式不同在於返回的序列從原陣列中刪除2.2、分割多個數組array_chunk($arr,3,TRUE); 可以將一個數組分割成多個,TRUE為保留原陣列的鍵名2.3、陣列的填充array_pad($arr,5,'x'); 將一個數組填補到制定長度三、陣列與棧array_push($arr,"apple","pear"); 將一個或多個元素壓入陣列棧的末尾(入棧),返回入棧元素的個數array_pop($arr); 將陣列棧的最後一個元素彈出(出棧)四、陣列與列隊array_shift($arr);陣列中的第一個元素移出並作為結果返回(陣列長度減1,其他元素向前移動一位,數字鍵名改為從零技術,文字鍵名不變)array_unshift($arr,"a",array(1,2));在陣列的開頭插入一個或多個元素五、回撥函式array_walk($arr,'function','words'); 使用使用者函式對陣列中的每個成員進行處理(第三個引數傳遞給回撥函式function)array_mpa("function",$arr1,$arr2); 可以處理多個數組(當使用兩個或更多陣列時,他們的長度應該相同)array_filter($arr,"function"); 使用回撥函式過濾陣列中的每個元素,如果回撥函式為TRUE,陣列的當前元素會被包含在返回的結果陣列中,陣列的鍵名保留不變array_reduce($arr,"function","*"); 轉化為單值函式(*為陣列的第一個值)六、陣列的排序6.1、通過元素值對陣列排序sort($arr); 由小到大的順序排序(第二個引數為按什麼方式排序)忽略鍵名的陣列排序rsort($arr); 由大到小的順序排序(第二個引數為按什麼方式排序)忽略鍵名的陣列排序usort($arr,"function"); 使用使用者自定義的比較函式對陣列中的值進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)忽略鍵名的
6.2、陣列排序asort($arr); 由小到大的順序排序(第二個引數為按什麼方式排序)保留鍵名的陣列排序arsort($arr); 由大到小的順序排序(第二個引數為按什麼方式排序)保留鍵名的陣列排序uasort($arr,"function"); 使用使用者自定義的比較函式對陣列中的值進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)保留鍵名的陣列排序6.3、通過鍵名對陣列排序ksort($arr); 按照鍵名正序排序krsort($arr); 按照鍵名逆序排序uksort($arr,"function"); 使用使用者自定義的比較函式對陣列中的鍵名進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)6.4、自然排序法排序natsort($arr); 自然排序(忽略鍵名)natcasesort($arr); 自然排序(忽略大小寫,忽略鍵名)七、陣列的計算7.1、陣列元素的求和array_sum($arr); 對陣列內部的所有元素做求和運算7.2、陣列的合併array_merge($arr1,$arr2); 合併兩個或多個數組(相同的字串鍵名,後面的覆蓋前面的,相同的數字鍵名,後面的不會做覆蓋操作,而是附加到後面)“+”$arr1+$arr2; 對於相同的鍵名只保留後一個array_merge_recursive($arr1,$arr2); 遞迴合併操作,如果陣列中有相同的字串鍵名,這些值將被合併到一個數組中去。如果一個值本身是一個數組,將按照相應的鍵名把它合併為另一個數組。當陣列 具有相同的陣列鍵名時,後一個值將不會覆蓋原來的值,而是附加到後面7.3、陣列的差集array_diff($arr1,$arr2); 返回差集結果陣列array_diff_assoc($arr1,$arr2,$arr3); 返回差集結果陣列,鍵名也做比較7.4陣列的交集array_intersect($arr1,$arr2); 返回交集結果陣列array_intersect_assoc($arr1,$arr2); 返回交集結果陣列,鍵名也做比較八、其他的陣列函式range(0,12); 建立一個包含指定範圍單元的陣列array_unique($arr); 移除陣列中重複的值,新的陣列中會保留原始的鍵名array_reverse($arr,TRUE); 返回一個單元順序與原陣列相反的陣列,如果第二個引數為TRUE保留原來的鍵名//srand((float)microtime()*10000000); 隨機種子觸發器array_rand($arr,2); 從陣列中隨機取出一個或 多個元素shuffle($arr); 將陣列的順序打亂
END
注意事項
陣列是一種特殊的型別,和字串、整型、bool型相差較大,理解有一定的難度,大家多做練習,儘量理解,後期陣列用到的比較多。