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