做(zuò)自(zì)由與創造的先行(xíng)者

Array 數(shù)組

PHP中文手冊

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