請注意,當陣列被複製時,其成員的「參考狀態」會被保留 (https://php.dev.org.tw/manual/en/language.references.whatdo.php)。
PHP 中的 陣列 實際上是一個有序的映射(map)。映射是一種將值關聯到鍵的型別。此型別針對多種不同的用途進行了優化;它可以被視為陣列、列表(向量)、雜湊表(映射的實作)、字典、集合、堆疊、佇列,以及可能更多。由於 陣列 的值可以是其他 陣列,因此也可能存在樹狀結構和多維 陣列。
對這些資料結構的解釋超出了本手冊的範圍,但至少會為每個結構提供一個範例。有關更多資訊,請參閱有關此廣泛主題的大量文獻。
可以使用 array() 語言結構建立 陣列。它接受任意數量的以逗號分隔的 鍵 => 值
對作為參數。
array( key => value, key2 => value2, key3 => value3, ... )
最後一個陣列元素後的逗號是可選的,可以省略。這通常用於單行陣列,例如,array(1, 2)
優於 array(1, 2, )
。另一方面,對於多行陣列,通常使用尾隨逗號,因為它允許更容易地在末尾添加新元素。
注意:
存在一種簡短的陣列語法,可以用
[]
取代array()
。
範例 #1 一個簡單的陣列
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 使用簡短的陣列語法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
此外,將會發生以下 鍵 的型別轉換
+
號,否則將轉換為 int 型別。例如,鍵 "8"
實際上將以 8
的形式儲存。另一方面,"08"
不會轉換,因為它不是有效的十進制整數。
8.7
實際上將以 8
的形式儲存。
true
實際上將以 1
的形式儲存,而鍵 false
將以 0
的形式儲存。
null
實際上將以 ""
的形式儲存。
Illegal offset type
。
如果陣列宣告中的多個元素使用相同的鍵,則只會使用最後一個,因為所有其他元素都會被覆寫。
範例 #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 陣列可以同時包含 int 和 string 鍵,因為 PHP 不區分索引陣列和關聯陣列。
<?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) }
鍵 是可選的。如果未指定,PHP 將使用先前使用的最大 int 鍵的遞增值。
範例 #4 沒有鍵的索引陣列
<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>
上述範例將會輸出
array(4) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(5) "hello" [3]=> string(5) "world" }
可以僅為某些元素指定鍵,而將其他元素的鍵省略
範例 #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
。
範例 #6 複雜的型別轉換與覆寫範例
此範例包含鍵的型別轉換和元素覆寫的所有變體。
<?php
$array = array(
1 => 'a',
'1' => 'b', // 值 "a" 會被 "b" 覆寫
1.5 => 'c', // 值 "b" 會被 "c" 覆寫
-1 => 'd',
'01' => 'e', // 因為這不是整數型態的字串,所以不會覆寫鍵值為 1 的值
'1.5' => 'f', // 因為這不是整數型態的字串,所以不會覆寫鍵值為 1 的值
true => 'g', // 值 "c" 會被 "g" 覆寫
false => 'h',
'' => 'i',
null => 'j', // 值 "i" 會被 "j" 覆寫
'k', // 值 "k" 會被賦予鍵值 2。這是因為之前最大的整數鍵值是 1
2 => 'l', // 值 "k" 會被 "l" 覆寫
);
var_dump($array);
?>
上述範例將會輸出
array(7) { [1]=> string(1) "g" [-1]=> string(1) "d" ["01"]=> string(1) "e" ["1.5"]=> string(1) "f" [0]=> string(1) "h" [""]=> string(1) "j" [2]=> string(1) "l" }
範例 #7 負索引範例
當指定一個負整數鍵值 n
時,PHP 會負責將下一個鍵值指定為 n+1
。
<?php
$array = [];
$array[-5] = 1;
$array[] = 2;
var_dump($array);
?>
上述範例將會輸出
array(2) { [-5]=> int(1) [-4]=> int(2) }
在 PHP 8.3.0 之前,指定一個負整數鍵值 n
會將下一個鍵值指定為 0
,因此之前的範例會輸出
array(2) { [-5]=> int(1) [0]=> int(2) }
可以使用 array[key]
語法存取陣列元素。
範例 #8 存取陣列元素
<?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"
注意:
在 PHP 8.0.0 之前,方括號和花括號可以互換使用來存取陣列元素 (例如,在上面的範例中,
$array[42]
和$array{42}
都會做相同的事情)。花括號語法從 PHP 7.4.0 開始被棄用,並且從 PHP 8.0.0 開始不再支援。
範例 #9 陣列解參考
<?php
function getArray() {
return array(1, 2, 3);
}
$secondElement = getArray()[1];
?>
注意:
嘗試存取尚未定義的陣列鍵值,就像存取任何其他未定義的變數一樣:會發出
E_WARNING
級別的錯誤訊息 (在 PHP 8.0.0 之前為E_NOTICE
級別),結果將會是null
。
注意:
解參考一個不是 string 的純量值會產生
null
。在 PHP 7.4.0 之前,這不會發出錯誤訊息。從 PHP 7.4.0 開始,這會發出E_NOTICE
;從 PHP 8.0.0 開始,這會發出E_WARNING
。
可以透過在現有的 array 中明確設定值來修改它。
這是透過將值指定給 array,並在方括號中指定鍵值來完成的。也可以省略鍵值,產生一對方括號 ([]
)。
$arr[key] = value; $arr[] = value; // key may be an int or string // value may be any value of any type
如果 $arr 尚未存在或設定為 null
或 false
,它將會被建立,因此這也是建立 array 的替代方法。然而,不建議這樣做,因為如果 $arr 已經包含一些值 (例如,來自請求變數的 string),那麼該值將會保留在原位,並且 []
可能實際上代表字串存取運算子。始終最好透過直接賦值來初始化變數。
注意: 從 PHP 7.1.0 開始,在字串上應用空索引運算子會拋出致命錯誤。以前,字串會靜默轉換為陣列。
注意: 從 PHP 8.1.0 開始,從
false
值建立新的陣列已被棄用。仍然允許從null
和未定義的值建立新的陣列。
若要變更特定值,請使用其鍵值將新值指定給該元素。若要移除鍵值/值對,請對其呼叫 unset() 函數。
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 這和 $arr[13] = 56; 相同
// 在此腳本的這一點上
$arr["x"] = 42; // 這會新增一個帶有鍵值 "x" 的新元素到陣列
unset($arr[5]); // 這會從陣列中移除該元素
unset($arr); // 這會刪除整個陣列
?>
注意:
如上所述,如果未指定鍵值,則會取現有 int 索引的最大值,並且新的鍵值將會是該最大值加 1(但至少為 0)。如果尚未存在任何 int 索引,則鍵值將會是
0
(零)。請注意,用於此的最大整數鍵值 *不需要目前存在於 array 中*。它只需要自上次 array 重新索引以來,在某個時間點存在於 array 中即可。以下範例說明了這一點
<?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 )
陣列可以使用 []
(自 PHP 7.1.0 起)或 list() 語言結構來解構。這些結構可以用於將陣列解構成不同的變數。
<?php
$source_array = ['foo', 'bar', 'baz'];
[$foo, $bar, $baz] = $source_array;
echo $foo; // 輸出 "foo"
echo $bar; // 輸出 "bar"
echo $baz; // 輸出 "baz"
?>
陣列解構可以用在 foreach 中,在迭代多維陣列時解構它。
<?php
$source_array = [
[1, 'John'],
[2, 'Jane'],
];
foreach ($source_array as [$id, $name]) {
// 在這裡使用 $id 和 $name 進行邏輯處理
}
?>
如果沒有提供變數,則會忽略陣列元素。陣列解構總是從索引 0
開始。
<?php
$source_array = ['foo', 'bar', 'baz'];
// 將索引 2 的元素賦值給變數 $baz
[, , $baz] = $source_array;
echo $baz; // 輸出 "baz"
?>
自 PHP 7.1.0 起,也可以解構關聯陣列。這也允許更輕鬆地選擇數字索引陣列中的正確元素,因為可以明確指定索引。
<?php
$source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3];
// 將索引 'baz' 的元素賦值給變數 $three
['baz' => $three] = $source_array;
echo $three; // 輸出 3
$source_array = ['foo', 'bar', 'baz'];
// 將索引 2 的元素賦值給變數 $baz
[2 => $baz] = $source_array;
echo $baz; // 輸出 "baz"
?>
陣列解構可以用於輕鬆交換兩個變數。
<?php
$a = 1;
$b = 2;
[$b, $a] = [$a, $b];
echo $a; // 輸出 2
echo $b; // 輸出 1
?>
注意:
展開運算符號(
...
)在賦值中不支援。
注意:
嘗試存取尚未定義的陣列鍵值,就像存取任何其他未定義的變數一樣:會發出
E_WARNING
級別的錯誤訊息 (在 PHP 8.0.0 之前為E_NOTICE
級別),結果將會是null
。
有許多實用的函式可以用於處理陣列。請參閱陣列函式章節。
注意:
unset() 函式允許從 array 中移除鍵。請注意,陣列將不會被重新索引。如果需要真正的「移除並移動」行為,可以使用 array_values() 函式重新索引 array。
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* 將產生一個本應被定義為
$a = array(1 => 'one', 3 => 'three');
而不是
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// 現在 $b 是 array(0 => 'one', 1 =>'three')
?>
$foo[bar]
是錯誤的?始終在字串文字陣列索引周圍使用引號。例如,$foo['bar']
是正確的,而 $foo[bar]
是不正確的。但為什麼呢?在舊腳本中經常會遇到這種語法。
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// 等等
?>
這是錯誤的,但它可以工作。原因是因為此程式碼具有一個未定義的常數(bar
),而不是一個 string('bar'
- 請注意引號)。它可以工作的原因是 PHP 會自動將裸字串(一個未加引號且不對應於任何已知符號的 string)轉換為一個包含該裸字串的 string。例如,如果沒有定義名為 bar
的常數,那麼 PHP 將替換為 string 'bar'
並使用它。
將未定義的常數作為裸字串的後備處理會發出 E_NOTICE
等級的錯誤。自 PHP 7.2.0 起,此行為已棄用,並發出 E_WARNING
等級的錯誤。自 PHP 8.0.0 起,此行為已被移除,並拋出 Error 例外。
注意: 這並不意味著要總是將鍵加上引號。請勿將 常數 或 變數 的鍵加上引號,因為這會阻止 PHP 解釋它們。
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// 簡單陣列:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\n正在檢查 $i: \n";
echo "錯誤: " . $array['$i'] . "\n";
echo "正確: " . $array[$i] . "\n";
echo "錯誤: {$array['$i']}\n";
echo "正確: {$array[$i]}\n";
}
?>上述範例將會輸出
Checking 0: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 1 Checking 1: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 2
更多範例來說明這個行為
<?php
// 顯示所有錯誤
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// 正確
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// 不正確。這會有效,但也會拋出 E_NOTICE 等級的 PHP 錯誤,因為
// 有一個名為 fruit 的未定義常數
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// 這會定義一個常數來展示發生了什麼。值 'veggie'
// 會賦予給名為 fruit 的常數。
define('fruit', 'veggie');
// 注意現在的差異
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// 以下是正確的,因為它在字串內。常數不會在字串中尋找
// 因此這裡不會發生 E_NOTICE
print "Hello $arr[fruit]"; // Hello apple
// 但有一個例外:字串內的大括號允許解讀常數
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// 這會無效,並產生剖析錯誤,例如:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// 當然這也適用於在字串中使用超全域變數
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// 連接是另一個選項
print "Hello " . $arr['fruit']; // Hello apple
?>
當 error_reporting 設定為顯示 E_NOTICE
等級錯誤(例如,設定為 E_ALL
),此類用法會立即顯現出來。預設情況下,error_reporting 設定為不顯示通知。
如在語法章節中所述,方括號('[
' 和 ']
')內部的內容必須是一個表達式。這表示像這樣的程式碼可以運作
<?php
echo $arr[somefunc($bar)];
?>
這是使用函數傳回值作為陣列索引的範例。PHP 也知道常數
<?php
$error_descriptions[E_ERROR] = "發生嚴重錯誤";
$error_descriptions[E_WARNING] = "PHP 發出警告";
$error_descriptions[E_NOTICE] = "這只是一個非正式的通知";
?>
請注意,E_ERROR
也是一個有效的識別符號,就像第一個範例中的 bar
一樣。但最後一個範例實際上與寫入以下內容相同
<?php
$error_descriptions[1] = "發生嚴重錯誤";
$error_descriptions[2] = "PHP 發出警告";
$error_descriptions[8] = "這只是一個非正式的通知";
?>
因為 E_ERROR
等於 1
,依此類推。
對於任何 int、float、字串、布林值 和 資源 類型,將值轉換為 陣列 會產生一個具有單一元素的陣列,其索引為零,並且值為轉換的純量。換句話說,(array) $scalarValue
與 array($scalarValue)
完全相同。
如果將 物件 轉換為 陣列,則結果會是 陣列,其元素是 物件 的屬性。鍵是成員變數名稱,但有一些顯著的例外:整數屬性無法存取;私有變數在變數名稱前加上類別名稱;受保護的變數在變數名稱前加上 '*'。這些前置值在兩側都有 NUL
位元組。未初始化的類型屬性會被靜默捨棄。
<?php
class A {
private $B;
protected $C;
public $D;
function __construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>
上述範例將會輸出
array ( '' . "\0" . 'A' . "\0" . 'B' => NULL, '' . "\0" . '*' . "\0" . 'C' => NULL, 'D' => NULL, 1 => NULL, )
這些 NUL
可能會導致一些非預期的行為。
<?php
class A {
private $A; // 這會變成 '\0A\0A'
}
class B extends A {
private $A; // 這會變成 '\0B\0A'
public $AA; // 這會變成 'AA'
}
var_dump((array) new B());
?>
上述範例將會輸出
array(3) { ["BA"]=> NULL ["AA"]=> NULL ["AA"]=> NULL }
上述程式碼看起來會有兩個名為 'AA' 的鍵,但其中一個實際上名為 '\0A\0A'。
可以使用 array_diff() 函數和陣列運算子來比較陣列。
以 ...
為前綴的陣列將在陣列定義期間就地展開。只有實作了 Traversable 的陣列和物件才能展開。使用 ...
進行陣列解包自 PHP 7.4.0 起可用。
可以多次展開,並在 ...
運算子之前或之後添加一般元素。
範例 #10 簡單陣列解包
<?php
// 使用短陣列語法。
// 也適用於 array() 語法。
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = [...$arr1, ...$arr2, 111]; //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
function getArr() {
return ['a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; //['a', 'b', 'c' => 'd']
?>
使用 ...
運算子解包陣列會遵循 array_merge() 函數的語意。也就是說,後來的字串鍵會覆寫先前的字串鍵,而整數鍵會重新編號。
範例 #11 具有重複鍵的陣列解包
<?php
// 字串鍵
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]
// 整數鍵
$arr4 = [1, 2, 3];
$arr5 = [4, 5, 6];
$arr6 = [...$arr4, ...$arr5];
var_dump($arr6); // [1, 2, 3, 4, 5, 6]
// 也就是 [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6]
// 其中原始的整數鍵沒有被保留。
?>
注意:
既非整數也非字串的鍵會拋出 TypeError。此類鍵只能由 Traversable 物件產生。
注意:
在 PHP 8.1 之前,不支援解包具有字串鍵的陣列。
<?php
$arr1 = [1, 2, 3];
$arr2 = ['a' => 4];
$arr3 = [...$arr1, ...$arr2];
// Fatal error: Uncaught Error: Cannot unpack array with string keys in example.php:5
$arr4 = [1, 2, 3];
$arr5 = [4, 5];
$arr6 = [...$arr4, ...$arr5]; // 可以執行。[1, 2, 3, 4, 5]
?>
PHP 中的陣列類型非常多功能。以下是一些範例
<?php
// 這個:
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // 鍵會是 0
);
$b = array('a', 'b', 'c');
// . . .完全等同於這個:
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // 鍵會是 0
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// 在執行上述程式碼後,$a 會是陣列
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4),而 $b 會是陣列
// array(0 => 'a', 1 => 'b', 2 => 'c'),或簡寫為 array('a', 'b', 'c')。
?>
範例 #12 使用 array()
<?php
// 將陣列作為(屬性)映射
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// 嚴格的數值鍵值
$array = array( 7,
8,
0,
156,
-10
);
// 這與 array(0 => 7, 1 => 8, ...) 相同
$switching = array( 10, // 鍵值 = 0
5 => 6,
3 => 7,
'a' => 4,
11, // 鍵值 = 6 (整數索引的最大值為 5)
'8' => 2, // 鍵值 = 8 (整數!)
'02' => 77, // 鍵值 = '02'
0 => 12 // 數值 10 將被 12 覆蓋
);
// 空陣列
$empty = array();
?>
範例 #13 集合
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
echo "你喜歡 $color 嗎?\n";
}
?>
上述範例將會輸出
Do you like red? Do you like blue? Do you like green? Do you like yellow?
透過傳遞參考,可以直接更改 array 的值。
範例 #14 在迴圈中更改元素
<?php
foreach ($colors as &$color) {
$color = mb_strtoupper($color);
}
unset($color); /* 確保接下來寫入 $color 不會修改最後一個陣列元素 */
print_r($colors);
?>
上述範例將會輸出
Array ( [0] => RED [1] => BLUE [2] => GREEN [3] => YELLOW )
此範例建立一個以 1 為基底的陣列。
範例 #15 以 1 為基底的索引
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
上述範例將會輸出
Array ( [1] => 'January' [2] => 'February' [3] => 'March' )
範例 #16 填滿陣列
<?php
// 使用目錄中的所有項目填滿陣列
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
陣列是有序的。可以使用各種排序函數更改順序。請參閱 陣列函數 章節以取得更多資訊。可以使用 count() 函數來計算 array 中的項目數量。
範例 #17 排序陣列
<?php
sort($files);
print_r($files);
?>
由於 array 的值可以是任何值,因此它也可以是另一個 array。這可以建立遞迴和多維 array。
範例 #18 遞迴和多維陣列
<?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"
)
);
// 上面陣列中一些用於尋址值的範例
echo $fruits["holes"][5]; // 印出 "second"
echo $fruits["fruits"]["a"]; // 印出 "orange"
unset($fruits["holes"][0]); // 移除 "first"
// 建立新的多維陣列
$juices["apple"]["green"] = "good";
?>
陣列指派始終涉及數值複製。使用參考運算子以參考方式複製 array。
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 已變更,
// $arr1 仍然是 array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // 現在 $arr1 和 $arr3 相同
?>
請注意,當陣列被複製時,其成員的「參考狀態」會被保留 (https://php.dev.org.tw/manual/en/language.references.whatdo.php)。
我認為你的第一個主要範例不必要地令人困惑,對新手來說非常困惑
$array = array(
"foo" => "bar",
"bar" => "foo",
);
應該移除它。
對於新手來說
陣列索引可以是任何字串值,甚至可以是陣列中也存在的數值。
array["foo"] 的值是 "bar"。
array["bar"] 的值是 "foo"
以下兩個表達式都為真
$array["foo"] == "bar"
$array["bar"] == "foo"
「如果將 NULL 值轉換為陣列,會得到一個空陣列。」
這證明是一個有用的屬性。假設您有一個搜尋函數,在成功時會傳回一個數值陣列,如果沒有找到任何東西則傳回 NULL。
<?php $values = search(...); ?>
現在您想要將該陣列與另一個陣列合併。如果 $values 是 NULL,我們該怎麼辦?沒問題
<?php $combined = array_merge((array)$values, $other); ?>
瞧!
請注意,如果您在 $_POST 陣列中使用字串作為索引,句點會被轉換為底線
<html>
<body>
<?php
printf("POST: "); print_r($_POST); printf("<br/>");
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="Windows3.1" value="Sux">
<input type="submit" value="Click" />
</form>
</body>
</html>
當您點擊按鈕後,頁面會顯示以下內容
POST: Array ( [Windows3_1] => Sux )
請注意,即使透過序列化,陣列數值儲存桶也是參考安全的。
<?php
$x='initial';
$test=array('A'=>&$x,'B'=>&$x);
$test=unserialize(serialize($test));
$test['A']='changed';
echo $test['B']; // 輸出 "changed"
?>
在某些情況下這很有用,例如在複雜的結構中節省 RAM。