PHP 中的陣列其實是一個有序映射。映射是一種把 values 關聯到 keys 的型別。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由於數組元素的值也可以是另一個數組,樹狀結構和多維數組也是允許的。
解釋這些結構超出了本手冊的範圍,但對於每種結構至少會提供一個例子。要得到這些結構的更多信息,建議參考有關此廣闊主題的其它著作。
語法
定義陣列 array()
可以用 array() 語言結構來新建一個陣列。它接受任意數量用逗號分隔的 鍵(key) => 值(value)對。
array( key => value
, ...
)
// 鍵(key)可是一個整數integer 或字串string
// 值(value)可以是任意型別的值
最後一個陣列單元之後的逗號可以省略。通常用於單行數組定義中,例如常用 array(1, 2) 而不是 array(1, 2, )。對多行數組定義通常保留最後一個逗號,這樣要新增一個單元時會更方便。
自 5.4 起可以使用短數組定義語法,並以 [] 取代 array()。
Example #1 一個簡單陣列
<?php $array = array( "foo" => "bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ]; ?>
key 可以是 integer 或 string。 value 可以是任意型別。
此外 key 會有如下的強制轉換:
包含有合法整數值的字串會被轉換為整數。例如鍵名 "8" 實際上會儲存為 8。但是 "08" 則不會強制轉換,因為其不是一個合法的十進制數值。
浮點數也會被轉換為整數,表示其小數部分會被捨去。例如鍵名 8.7 實際上會被儲存為 8。
布爾值也會被轉換成整數型。即鍵名 true 實際上會儲存為 1 而鍵名 false 會被儲存為 0。
Null 會被轉換為空字串,即鍵名 null 實際會儲存為 ""。
數組和物件不能被用為鍵名。堅持這麼做會導致警告:Illegal offset type。
如果在陣列定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了。
Example #2 類型強制與覆蓋範例
<?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?>
以上例程會輸出:
array(1) { [1]=> string(1) "d" }
上例中所有的鍵名都被強制轉換為1,則每一個新單元都會覆蓋前一個的值,最後剩下的只有一個"d"。
PHP 數組可以同時含有 integer 和 string 類型的鍵名,因為 PHP 實際上並沒有區分索引數組和關聯數組。
如果對給出的值沒有指定鍵名,則取目前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆寫。
Example #3 混合 integer 和 string 鍵名
<?php $array = array( "foo" => "bar", "bar" => "foo", 100 => -100, -100 => 100, ); var_dump($array); ?>
以上程式會輸出:
array(4) { ["foo"]=> string(3) "bar" ["bar"]=> string(3) "foo" [100]=> int(-100) [-100]=> int(100) }
key 為可選項。如果未指定,PHP 將自動使用先前用過的最大 integer 鍵名加上 1 作為新的鍵名。
Example #4 沒有鍵名的索引數組
<?php $array = array("foo", "bar", "hallo", "world"); var_dump($array); ?>
以上例程會輸出:
array(4) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(5) "hallo" [3]=> string(5) "world" }
還可以只對某些單元指定鍵名而對其它的空置:
Example #5 僅對部分單元指定鍵名名
<?php $array = array( "a", "b", 6 => "c", "d", ); var_dump($array); ?>
以上例程會輸出:
array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" }
可以看到最後一個值"d" 自動賦予了鍵名7。這是由於之前最大的整數鍵名稱是 6。
用方括號語法存取數組單元
數組單元可以透過 array[key] 語法存取。
Example #6 存取陣列單元
<?php $array = array( "foo" => "bar", 42 => 24, "multi" => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); ?>
以上程式會輸出:
string(3) "bar" int(24) string(3) "foo"
Note:
方括號和花括號可以互換使用來存取陣列單元(例如$array[42] 和$array}在上例中效果相同)。
自 PHP 5.4 起可以用陣列間接引用函數或方法呼叫的結果。之前只能通過一個臨時變數。
自 PHP 5.5 起可以用陣列間接引用一個陣列原型。
Example #7 陣列間接引用
<?php function getArray() { return array(1, 2, 3); } // on PHP 5.4 $secondElement = getArray()[1]; // previously $tmp = getArray(); $secondElement = $tmp[1]; // or list(, $secondElement) = getArray(); ?>
Note:
試圖存取一個未定義的陣列鍵名與存取任何未定義變數一樣:會導致 E_NOTICE 層級錯誤訊息,其結果為 NULL。
用方括號的語法新建/修改
可以透過明示地設定其中的值來修改一個已有數組。
這是透過在方括號內指定鍵名來賦值陣列來實現的。也可以省略鍵名,在這種情況下為變數名稱加上一對空的方括號([])。
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意类型的值
如果 $arr 还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而 [] 实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。。
要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用 unset() 函数。
<?php $arr = array(5 => 1, 12 => 2); $arr[] = 56; // This is the same as $arr[13] = 56; // at this point of the script $arr["x"] = 42; // This adds a new element to // the array with key "x" unset($arr[5]); // This removes the element from the array unset($arr); // This deletes the whole array ?>
Note:
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
<?php // 创建一个简单的数组 $array = array(1, 2, 3, 4, 5); print_r($array); // 现在删除其中的所有元素,但保持数组本身不变: foreach ($array as $i => $value) { unset($array[$i]); } print_r($array); // 添加一个单元(注意新的键名是 5,而不是你可能以为的 0) $array[] = 6; print_r($array); // 重新索引: $array = array_values($array); $array[] = 7; print_r($array); ?>
以上例程会输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
实用函数
有很多操作数组的函数,参见数组函数一节。
Note:
unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。
d187627a39155b76819487cf772766aa 'January'
[2] => 'February'
[3] => 'March'
)
Example #12 填充数组
<?php // fill an array with all items from a directory $handle = opendir('.'); while (false !== ($file = readdir($handle))) { $files[] = $file; } closedir($handle); ?>
数组是有序的。也可以使用不同的排序函数来改变顺序。更多信息参见数组函数。可以用 count() 函数来数出数组中元素的个数。
Example #13 数组排序
<?php sort($files); print_r($files); ?>
因为数组中的值可以为任意值,也可是另一个数组。这样可以产生递归或多维数组。
Example #14 递归和多维数组
<?php $fruits = array ( "fruits" => array ( "a" => "orange", "b" => "banana", "c" => "apple" ), "numbers" => array ( 1, 2, 3, 4, 5, 6 ), "holes" => array ( "first", 5 => "second", "third" ) ); // Some examples to address values in the array above echo $fruits["holes"][5]; // prints "second" echo $fruits["fruits"]["a"]; // prints "orange" unset($fruits["holes"][0]); // remove "first" // Create a new multi-dimensional array $juices["apple"]["green"] = "good"; ?>
数组(Array) 的赋值总是会涉及到值的拷贝。使用引用运算符通过引用来拷贝数组。
<?php $arr1 = array(2, 3); $arr2 = $arr1; $arr2[] = 4; // $arr2 is changed, // $arr1 is still array(2, 3) $arr3 = &$arr1; $arr3[] = 4; // now $arr1 and $arr3 are the same ?>