做自(zì)由與創造的先行者

Array 數組

PHP中文(wén)手冊

<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)發
下(xià)一篇:Object 對(duì)象
上(shàng)一篇:數字字符串