PHP Conference Japan 2024

陣列

PHP 中的 陣列 實際上是一個有序的映射(map)。映射是一種將關聯到的型別。此型別針對多種不同的用途進行了優化;它可以被視為陣列、列表(向量)、雜湊表(映射的實作)、字典、集合、堆疊、佇列,以及可能更多。由於 陣列 的值可以是其他 陣列,因此也可能存在樹狀結構和多維 陣列

對這些資料結構的解釋超出了本手冊的範圍,但至少會為每個結構提供一個範例。有關更多資訊,請參閱有關此廣泛主題的大量文獻。

語法

使用 array() 指定

可以使用 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",
];
?>

可以是 intstring 可以是任何型別。

此外,將會發生以下 的型別轉換

  • 包含有效十進制 int字串,除非該數字前面帶有 + 號,否則將轉換為 int 型別。例如,鍵 "8" 實際上將以 8 的形式儲存。另一方面,"08" 不會轉換,因為它不是有效的十進制整數。
  • 浮點數 也會轉換為 int,這表示小數部分將會被截斷。例如,鍵 8.7 實際上將以 8 的形式儲存。
  • 布林值 也會轉換為 int,也就是說,鍵 true 實際上將以 1 的形式儲存,而鍵 false 將以 0 的形式儲存。
  • Null 將轉換為空字串,也就是說,鍵 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 陣列可以同時包含 intstring 鍵,因為 PHP 不區分索引陣列和關聯陣列。

範例 #3 混合使用 intstring

<?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 尚未存在或設定為 nullfalse,它將會被建立,因此這也是建立 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')
?>

foreach 控制結構專門用於 array。它提供了一種遍歷 array 的簡單方法。

陣列的注意事項

為什麼 $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,依此類推。

那麼為什麼這是不好的呢?

在未來的某個時候,PHP 團隊可能想要新增另一個常數或關鍵字,或者其他程式碼中的常數可能會造成干擾。例如,以這種方式使用 emptydefault 這兩個詞已經是錯誤的,因為它們是保留關鍵字

注意 重申一下,在雙引號括住的 字串 內,不使用引號括住陣列索引是有效的,因此 "$foo[bar]" 是有效的。請參閱上面的範例以了解原因,以及有關在字串中剖析變數的章節。

轉換為陣列

對於任何 intfloat字串布林值資源 類型,將值轉換為 陣列 會產生一個具有單一元素的陣列,其索引為零,並且值為轉換的純量。換句話說,(array) $scalarValuearray($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'。

null 轉換為 陣列 會產生一個空的 陣列

比較

可以使用 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 相同
?>
新增註解

使用者貢獻的註解 5 個註解

128
mlvljr
13 年前
請注意,當陣列被複製時,其成員的「參考狀態」會被保留 (https://php.dev.org.tw/manual/en/language.references.whatdo.php)。
74
thomas tulinsky
8 年前
我認為你的第一個主要範例不必要地令人困惑,對新手來說非常困惑

$array = array(
"foo" => "bar",
"bar" => "foo",
);

應該移除它。

對於新手來說
陣列索引可以是任何字串值,甚至可以是陣列中也存在的數值。
array["foo"] 的值是 "bar"。
array["bar"] 的值是 "foo"

以下兩個表達式都為真
$array["foo"] == "bar"
$array["bar"] == "foo"
59
ken underscore yap atsign email dot com
16 年前
「如果將 NULL 值轉換為陣列,會得到一個空陣列。」

這證明是一個有用的屬性。假設您有一個搜尋函數,在成功時會傳回一個數值陣列,如果沒有找到任何東西則傳回 NULL。

<?php $values = search(...); ?>

現在您想要將該陣列與另一個陣列合併。如果 $values 是 NULL,我們該怎麼辦?沒問題

<?php $combined = array_merge((array)$values, $other); ?>

瞧!
55
jeff splat codedread splot com
19 年前
請注意,如果您在 $_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 )
37
chris at ocportal dot com
11 年前
請注意,即使透過序列化,陣列數值儲存桶也是參考安全的。

<?php
$x
='initial';
$test=array('A'=>&$x,'B'=>&$x);
$test=unserialize(serialize($test));
$test['A']='changed';
echo
$test['B']; // 輸出 "changed"
?>

在某些情況下這很有用,例如在複雜的結構中節省 RAM。
To Top