<p>PHP 中的 array 實際上(shàng)是一個有序映射。映射是一種把 values 關聯到(dào) keys 的類型。此類型針對(duì)多種不同用(yòng)途進行了(le)優化; 它可以被視(shì)爲數組、列表(向量)、哈希表(映射的實現(xiàn))、字典、集合、堆棧、隊列等等。 由于 array 的值可以是其它 array 所以樹形結構和(hé)多維 array 也(yě)是允許的。
解釋這(zhè)些(xiē)數據結構超出了(le)本手冊的範圍,但(dàn)對(duì)每種結構至少會(huì)提供一個例子。 要得到(dào)這(zhè)些(xiē)數據結構的更多信息,建議(yì)參考有關此廣闊主題的其它文(wén)獻。
語法 ¶
定義數組 array() ¶
可以用(yòng) array() 語言結構來(lái)新建一個 array。它接受任意數量用(yòng)逗号分隔的 鍵(key) => 值(value) 對(duì)。
array(
key => value,
key2 => value2,
key3 => value3,
...
)
最後一個數組單元之後的逗号可以省略。通常用(yòng)于單行數組定義中,例如常用(yòng) array(1, 2) 而不是 array(1, 2, )。對(duì)多行數組定義通常保留最後一個逗号,這(zhè)樣要添加一個新單元時(shí)更方便。
注意:
可以用(yòng)短數組語法 [] 替代 array() 。
示例 #1 一個簡單數組
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 使用(yòng)短數組語法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key 可以是 integer 或者 string。value 可以是任意類型。
此外(wài) key 會(huì)有如下(xià)的強制轉換:
String 中包含有效的十進制 int,除非數字前面有一個 + 号,否則将被轉換爲 int 類型。例如鍵名 "8" 實際會(huì)被儲存爲 8。另外(wài), "08" 不會(huì)被強制轉換,因爲它不是一個有效的十進制整數。
Float 也(yě)會(huì)被轉換爲 int ,意味着其小(xiǎo)數部分會(huì)被舍去。例如鍵名 8.7 實際會(huì)被儲存爲 8。
Bool 也(yě)會(huì)被轉換成 int。即鍵名 true 實際會(huì)被儲存爲 1 而鍵名 false 會(huì)被儲存爲 0。
Null 會(huì)被轉換爲空(kōng)字符串,即鍵名 null 實際會(huì)被儲存爲 ""。
Array 和(hé) object 不能(néng) 被用(yòng)爲鍵名。堅持這(zhè)麽做會(huì)導緻警告:Illegal offset type。
如果在數組定義時(shí)多個元素都使用(yòng)相同鍵名,那麽隻有最後一個會(huì)被使用(yòng),其它的元素都會(huì)被覆蓋。
示例 #2 類型轉換與覆蓋的示例
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
以上(shàng)例程會(huì)輸出:
array(1) {
[1]=>
string(1) "d"
}
上(shàng)例中所有的鍵名都被強制轉換爲 1,則每一個新單元都會(huì)覆蓋前一個的值,最後剩下(xià)的隻有一個 "d"。
PHP 數組可以同時(shí)含有 int 和(hé) string 類型的鍵名,因爲 PHP 實際并不區(qū)分索引數組和(hé)關聯數組。
示例 #3 混合 int 和(hé) string 鍵名
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
以上(shàng)例程會(huì)輸出:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
key 爲可選項。如果未指定,PHP 将自(zì)動使用(yòng)之前用(yòng)過的最大(dà) int 鍵名加上(shàng) 1 作(zuò)爲新的鍵名。
示例 #4 沒有鍵名的索引數組
<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>
以上(shàng)例程會(huì)輸出:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hello"
[3]=>
string(5) "world"
}
還可以隻對(duì)某些(xiē)單元指定鍵名而對(duì)其它的空(kōng)置:
示例 #5 僅對(duì)部分單元指定鍵名
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
以上(shàng)例程會(huì)輸出:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
可以看(kàn)到(dào)最後一個值 "d" 被自(zì)動賦予了(le)鍵名 7。這(zhè)是由于之前最大(dà)的整數鍵名是 6。
示例 #6 複雜(zá)類型轉換和(hé)覆蓋的例子
這(zhè)個例子包括鍵名類型轉換和(hé)元素覆蓋的所有變化。
<?php
$array = array(
1 => 'a',
'1' => 'b', // 值 "a" 會(huì)被 "b" 覆蓋
1.5 => 'c', // 值 "b" 會(huì)被 "c" 覆蓋
-1 => 'd',
'01' => 'e', // 由于這(zhè)不是整數字符串,因此不會(huì)覆蓋鍵名 1
'1.5' => 'f', // 由于這(zhè)不是整數字符串,因此不會(huì)覆蓋鍵名 1
true => 'g', // 值 "c" 會(huì)被 "g" 覆蓋
false => 'h',
'' => 'i',
null => 'j', // 值 "i" 會(huì)被 "j" 覆蓋
'k', // 值 “k” 的鍵名被分配爲 2。這(zhè)是因爲之前最大(dà)的整數鍵是 1
2 => 'l', // 值 "k" 會(huì)被 "l" 覆蓋
);
var_dump($array);
?>
以上(shàng)例程會(huì)輸出:
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"
}
用(yòng)方括号語法訪問數組單元 ¶
數組單元可以通過 array[key] 語法來(lái)訪問。
示例 #7 訪問數組單元
<?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"]);
?>
以上(shàng)例程會(huì)輸出:
string(3) "bar"
int(24)
string(3) "foo"
注意:
在 PHP 8.0.0 之前,方括号和(hé)花(huā)括号可以互換使用(yòng)來(lái)訪問數組單元(例如 $array[42] 和(hé) $array{42} 在上(shàng)例中效果相同)。 花(huā)括号語法在 PHP 7.4.0 中已棄用(yòng),在 PHP 8.0.0 中不再支持。
示例 #8 數組解引用(yòng)
<?php
function getArray() {
return array(1, 2, 3);
}
$secondElement = getArray()[1];
?>
注意:
試圖訪問一個未定義的數組鍵名與訪問任何未定義變量一樣:會(huì)導緻 E_WARNING 級别錯誤信息(在 PHP 8.0.0 之前是 E_NOTICE 級别),其結果爲 null。
注意:
數組解引用(yòng)非 string 的标量值會(huì)産生 null。 在 PHP 7.4.0 之前,它不會(huì)發出錯誤消息。 從(cóng) PHP 7.4.0 開(kāi)始,這(zhè)個問題産生 E_NOTICE ; 從(cóng) PHP 8.0.0 開(kāi)始,這(zhè)個問題産生 E_WARNING 。
用(yòng)方括号的語法新建/修改 ¶
可以通過明(míng)示地設定其中的值來(lái)修改現(xiàn)有的 array 。
這(zhè)是通過在方括号内指定鍵名來(lái)給 array 賦值實現(xiàn)的。也(yě)可以省略鍵名,在這(zhè)種情況下(xià)給變量名加上(shàng)一對(duì)空(kōng)的方括号([])。
$arr[key] = value;
$arr[] = value;
// key 可以是 int 或 string
// value 可以是任意類型的值
如果 $arr 不存在或者設置爲 null 或者 false,将會(huì)新建它,這(zhè)也(yě)是另一種創建 array 的方法。不過并不鼓勵這(zhè)樣做,因爲如果 $arr 已經包含有值(例如來(lái)自(zì)請(qǐng)求變量的 string)則此值會(huì)保留而 [] 實際上(shàng)代表着字符串訪問運算(suàn)符。初始化變量的最好(hǎo)方式是直接給其賦值。
注意: 從(cóng) PHP 7.1.0 起,對(duì)字符串應用(yòng)空(kōng)索引操作(zuò)符會(huì)抛出緻命錯誤。以前,字符串被靜默地轉換爲數組。
注意: 從(cóng) PHP 8.1.0 起,棄用(yòng)從(cóng) false 值中創建一個新數組。 但(dàn)仍然允許從(cóng) null 或者未定義的變量中創建新數組。
要修改某個值,通過其鍵名給該單元賦一個新值。要删除某鍵值對(duì),對(duì)其調用(yòng) unset() 函數。
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 這(zhè)與 $arr[13] = 56 相同;
// 在腳本的這(zhè)一點上(shàng)
$arr["x"] = 42; // 添加一個新元素
// 鍵名使用(yòng) "x"
unset($arr[5]); // 從(cóng)數組中删除元素
unset($arr); // 删除整個數組
?>
注意:
如上(shàng)所述,如果給出方括号但(dàn)沒有指定鍵名,則取當前最大(dà) int 索引值,新的鍵名将是該值加上(shàng) 1(但(dàn)是最小(xiǎo)爲 0)。如果當前還沒有 int 索引,則鍵名将爲 0 。
注意這(zhè)裏所使用(yòng)的最大(dà)整數鍵名目前不需要存在于 array 中。 它隻要在上(shàng)次 array 重新生成索引後曾經存在于 array 就行了(le)。以下(xià)面的例子來(lái)說明(míng):
<?php
// 創建一個簡單的數組
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 現(xiàn)在删除其中的所有元素,但(dàn)保持數組本身不變:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一個單元(注意新的鍵名是 5,而不是你(nǐ)可能(néng)以爲的 0)
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
以上(shàng)例程會(huì)輸出:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
數組解包 ¶
可以使用(yòng) [](自(zì) PHP 7.1.0 起)或者 list() 語言結構解包數組。這(zhè)些(xiē)結構可用(yòng)于将數組解包爲不同的變量。
<?php
$source_array = ['foo', 'bar', 'baz'];
[$foo, $bar, $baz] = $source_array;
echo $foo; // 打印 "foo"
echo $bar; // 打印 "bar"
echo $baz; // 打印 "baz"
?>
數組解包可用(yòng)于 foreach 在叠代多維數組時(shí)對(duì)其進行解包。
<?php
$source_array = [
[1, 'John'],
[2, 'Jane'],
];
foreach ($source_array as [$id, $name]) {
// 這(zhè)裏是 $id 和(hé) $name 的邏輯
}
?>
如果變量未提供,數組元素将會(huì)被忽略。數組解包始終從(cóng)索引 0 開(kāi)始。
<?php
$source_array = ['foo', 'bar', 'baz'];
// 将索引 2 的元素分配給變量 $baz
[, , $baz] = $source_array;
echo $baz; // 打印 "baz"
?>
自(zì) PHP 7.1.0 起,也(yě)可以解包關聯數組。這(zhè)在數字索引數組中更容易選擇正确的元素,因爲可以顯式指定索引。
<?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"
?>
數組解包可以方便的用(yòng)于兩個變量交換。
<?php
$a = 1;
$b = 2;
[$b, $a] = [$a, $b];
echo $a; // 打印 2
echo $b; // 打印 1
?>
注意:
分配時(shí)不支持展開(kāi)運算(suàn)符(...)。
注意:
嘗試訪問未定義的數組鍵與訪問任何未定義的變量相同:都将發出 E_WARNING 級别的錯誤消息(PHP 8.0.0 之前是 E_NOTICE 級别),結果将是 null。
實用(yòng)函數 ¶
有很(hěn)多操作(zuò)數組的函數,參見 數組函數 一節。
注意:
unset() 函數允許删除 array 中的某個鍵。但(dàn)要注意數組将不會(huì)重建索引。如果需要删除後重建索引,可以用(yòng) 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);
// 現(xiàn)在 $b 是 array(0 => 'one', 1 =>'three')
?>
foreach 控制結構是專門(mén)用(yòng)于 array 的。它提供了(le)一個簡單的方法來(lái)遍曆 array。
數組做什(shén)麽和(hé)不做什(shén)麽 ¶
爲什(shén)麽 $foo[bar] 錯了(le)? ¶
應該始終在用(yòng)字符串表示的數組索引上(shàng)加上(shàng)引号。例如用(yòng) $foo['bar'] 而不是 $foo[bar]。但(dàn)是爲什(shén)麽呢(ne)?可能(néng)在老(lǎo)的腳本中見過如下(xià)語法:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// 及其它
?>
這(zhè)樣是錯的,但(dàn)可以正常運行。那麽爲什(shén)麽錯了(le)呢(ne)?原因是此代碼中有一個未定義的常量( bar )而不是 string('bar'-注意引号)。而 PHP 可能(néng)會(huì)在以後定義此常量,不幸的是你(nǐ)的代碼中有同樣的名字。它能(néng)運行,是因爲 PHP 自(zì)動将裸字符串(沒有引号的 string 且不對(duì)應于任何已知(zhī)符号)轉換成一個其值爲該裸 string 的 string。例如,如果沒有常量定義爲 bar,那麽PHP 将在 string 中替代爲 'bar' 并使用(yòng)之。
警告
将未定義的常量當作(zuò)裸字符串的回退會(huì)觸發 E_NOTICE 級别錯誤。 從(cóng) PHP 7.2.0 起已廢棄,并觸發 E_WARNING 級别錯誤。 從(cóng) PHP 8.0.0 起被移除,并觸發 Error 異常。
注意: 這(zhè)并不意味着總是給鍵名加上(shàng)引号。用(yòng)不着給鍵名爲 常量 或 變量 的加上(shàng)引号,否則會(huì)使 PHP 不能(néng)解析它們。
<?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 "好(hǎo)的: " . $array[$i] . "\n";
echo "壞的: {$array['$i']}\n";
echo "好(hǎo)的: {$array[$i]}\n";
}
?>
以上(shàng)例程會(huì)輸出:
檢查 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
壞的:
好(hǎo)的: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
壞的:
好(hǎo)的: 1
檢查 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
壞的:
好(hǎo)的: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
壞的:
好(hǎo)的: 2
演示此行爲的更多例子:
<?php
// 顯示所有錯誤
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// 正确的
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// 不正确的。 這(zhè)可以工(gōng)作(zuò),但(dàn)也(yě)會(huì)抛出一個 E_NOTICE 級别的 PHP 錯誤,因爲
// 未定義名爲 apple 的常量
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// 這(zhè)定義了(le)一個常量來(lái)演示正在發生的事(shì)情。 值 'veggie'
// 被分配給一個名爲 fruit 的常量。
define('fruit', 'veggie');
// 注意這(zhè)裏的區(qū)别
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// 以下(xià)是可以的,因爲它在字符串中。
// 不會(huì)在字符串中查找常量,因此此處不會(huì)出現(xiàn) E_NOTICE
print "Hello $arr[fruit]"; // Hello apple
// 有一個例外(wài):字符串中花(huā)括号圍繞的數組中常量可以被解釋
//
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// 這(zhè)将不起作(zuò)用(yòng),并會(huì)導緻解析錯誤,例如:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// 這(zhè)當然也(yě)适用(yòng)于在字符串中使用(yòng)超全局變量
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// 串聯是另一種選擇
print "Hello " . $arr['fruit']; // Hello apple
?>
當打開(kāi) error_reporting 來(lái)顯示 E_NOTICE 級别的錯誤(将其設爲 E_ALL)時(shí)将看(kàn)到(dào)這(zhè)些(xiē)錯誤。默認情況下(xià) error_reporting 被關閉不顯示這(zhè)些(xiē)。
和(hé)在 語法 一節中規定的一樣,在方括号([” 和(hé) “]”)之間必須有一個表達式。這(zhè)意味着可以這(zhè)樣寫:
<?php
echo $arr[somefunc($bar)];
?>
這(zhè)是一個用(yòng)函數返回值作(zuò)爲數組索引的例子。PHP 也(yě)可以用(yòng)已知(zhī)常量,可能(néng)之前已經見過:
<?php
$error_descriptions[E_ERROR] = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
注意 E_ERROR 也(yě)是個合法的标識符,就和(hé)第一個例子中的 bar 一樣。但(dàn)是上(shàng)一個例子實際上(shàng)和(hé)如下(xià)寫法是一樣的:
<?php
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
因爲 E_ERROR 等于 1,等等。
那麽爲什(shén)麽這(zhè)樣做不好(hǎo)?
也(yě)許有一天,PHP 開(kāi)發小(xiǎo)組可能(néng)會(huì)想新增一個常量或者關鍵字,或者用(yòng)戶可能(néng)希望以後在自(zì)己的程序中引入新的常量,那就有麻煩了(le)。例如已經不能(néng)這(zhè)樣用(yòng) empty 和(hé) default 這(zhè)兩個詞了(le),因爲他(tā)們是 保留關鍵字。
注意: 重申一次,在雙引号字符串中,不給索引加上(shàng)引号是合法的因此 "$foo[bar]" 是合法的(“合法”的原文(wén)爲 valid。在實際測試中,這(zhè)麽做确實可以訪問數組的該元素,但(dàn)是會(huì)報(bào)一個常量未定義的 notice。無論如何,強烈建議(yì)不要使用(yòng) $foo[bar]這(zhè)樣的寫法,而要使用(yòng) $foo['bar'] 來(lái)訪問數組中元素。--haohappy 注)。至于爲什(shén)麽參見以上(shàng)的例子和(hé) 字符串中的變量解析 中的解釋。
轉換爲數組 ¶
對(duì)于任意 int,float, string,bool 和(hé) resource 類型,如果将一個值轉換爲 array,将得到(dào)一個僅有一個元素的數組,其下(xià)标爲 0,該元素即爲此标量的值。換句話(huà)說,(array)$scalarValue 與 array($scalarValue) 完全一樣。
如果将 object 類型轉換爲 array,則結果爲一個數組,其單元爲該對(duì)象的屬性。鍵名将爲成員變量名,不過有幾點例外(wài):整數屬性不可訪問; 私有變量前會(huì)加上(shàng)類名作(zuò)前綴;保護變量前會(huì)加上(shàng)一個 '*' 做前綴。這(zhè)些(xiē)前綴的前後都各有一個 NUL 字節。 未初始化的類型屬性将會(huì)被丢棄。
<?php
class A {
private $B;
protected $C;
public $D;
function __construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>
以上(shàng)例程會(huì)輸出:
array (
'' . "\0" . 'A' . "\0" . 'B' => NULL,
'' . "\0" . '*' . "\0" . 'C' => NULL,
'D' => NULL,
1 => NULL,
)
這(zhè)些(xiē) NUL 會(huì)導緻一些(xiē)意想不到(dào)的行爲:
<?php
class A {
private $A; // 将變爲 '\0A\0A'
}
class B extends A {
private $A; // 将變爲 '\0B\0A'
public $AA; // 将變爲 'AA'
}
var_dump((array) new B());
?>
以上(shàng)例程會(huì)輸出:
array(3) {
["BA"]=>
NULL
["AA"]=>
NULL
["AA"]=>
NULL
}
上(shàng)例會(huì)有兩個鍵名爲 'AA',不過其中一個實際上(shàng)是 '\0A\0A'。
将 null 轉換爲 array 會(huì)得到(dào)一個空(kōng)的數組。
比較 ¶
可以用(yòng) array_diff() 函數和(hé) 數組運算(suàn)符 來(lái)比較數組。
數組解包 ¶
在 array 定義時(shí),用(yòng) ... 前綴的一個 array 可以被展開(kāi)到(dào)當前位置。 隻有實現(xiàn)了(le) Traversable 的數組和(hé)對(duì)象才能(néng)被展開(kāi)。 PHP 7.4.0 開(kāi)始可以使用(yòng) ... 解包 array。
它可以多次使用(yòng),在 ... 操作(zuò)符前後都可以添加常規元素:
示例 #9 簡單的數組解包
<?php
// 使用(yòng)簡短的數組語法。
// 亦可用(yòng)于 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']
?>
... 操作(zuò)符解包 array 時(shí)也(yě)遵守函數 array_merge() 的語義。 也(yě)就是說,key 爲字符時(shí),後面的字符鍵會(huì)覆蓋之前的字符鍵;key 爲 integer 時(shí)則會(huì)重新編号:
示例 #10 重複 key 的數組解包
<?php
// string key
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]
// integer key
$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]
// 也(yě)就是原始的 integer key 不再保留
?>
注意:
既不是 integer 也(yě)不是 string 的 key 會(huì)抛出 TypeError。 這(zhè)類 key 隻能(néng)通過 Traversable 對(duì)象生成。
注意:
在 PHP 8.1 之前,帶有 string 鍵的 array 無法解包:
<?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]; // works. [1, 2, 3, 4, 5]
?>
示例 ¶
PHP 中的數組類型有非常多的用(yòng)途。以下(xià)是一些(xiē)示例:
<?php
// This:
$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';
// 執行上(shàng)述代碼後,數組 $a 将是
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), 數組 $b 将是
// array(0 => 'a', 1 => 'b', 2 => 'c'), 或簡單的 array('a', 'b', 'c').
?>
示例 #11 使用(yòng) array()
<?php
// Array as (property-)map
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// 嚴格的數字鍵
$array = array( 7,
8,
0,
156,
-10
);
// 這(zhè)相當于 array(0 => 7, 1 => 8, ...)
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (整數索引的最大(dà)值爲 5)
'8' => 2, // key = 8 (整數!)
'02' => 77, // key = '02'
0 => 12 // 值 10 被 12 覆蓋
);
// 空(kōng)數組
$empty = array();
?>
示例 #12 集合
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
echo "Do you like $color?\n";
}
?>
以上(shàng)例程會(huì)輸出:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
可以通過引用(yòng)傳遞 array 的值來(lái)直接更改數組的值。
示例 #13 在循環中改變單元
<?php
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* 确保後面對(duì)
$color 的寫入不會(huì)修改最後一個數組元素 */
print_r($colors);
?>
以上(shàng)例程會(huì)輸出:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
本例生成一個下(xià)标從(cóng) 1 開(kāi)始的數組。
示例 #14 下(xià)标從(cóng) 1 開(kāi)始的數組
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
以上(shàng)例程會(huì)輸出:
Array
(
[1] => 'January'
[2] => 'February'
[3] => 'March'
)
示例 #15 填充數組
<?php
// 把指定目錄中的所有項填充到(dào)數組
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
Array 是有序的。也(yě)可以使用(yòng)不同的排序函數來(lái)改變順序。更多信息參見 數組函數。可以用(yòng) count() 函數來(lái)統計(jì)出 array 中元素的個數。
示例 #16 數組排序
<?php
sort($files);
print_r($files);
?>
因爲 array 中的值可以爲任意值,也(yě)可是另一個 array。這(zhè)樣可以産生遞歸或多維 array。
示例 #17 遞歸和(hé)多維數組
<?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"
)
);
// 處理(lǐ)上(shàng)面數組中的值的一些(xiē)例子
echo $fruits["holes"][5]; // 打印 "second"
echo $fruits["fruits"]["a"]; // 打印 "orange"
unset($fruits["holes"][0]); // 删除 "first"
// 創建一個新的多維數組
$juices["apple"]["green"] = "good";
?>
Array 的賦值總是會(huì)涉及到(dào)值的拷貝。使用(yòng) 引用(yòng)運算(suàn)符 通過引用(yòng)來(lái)拷貝 array。
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 已更改,
// $arr1 仍然是 array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // 現(xiàn)在 $arr1 和(hé) $arr3 是一樣的
?></p>
網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發