陣列就像是個大櫃子,可以存放好多好多的東西
可以由兩種格式產生(兩者相等):
$a1 = ['a', 'b', 'c'];
$a2 = array('a', 'b', 'c');
var_dump($a1 === $a2); // bool(true)
有兩種不同形式:
// 索引陣列 Indexed Array
$a1 = ['air', 'bag', 'cat'];
// 關聯陣列 Associative Array
$a2 = ['a' => 'air', 'b' => 'bag', 'c' => 'cat'];
var_dump($a1 == $a2); // bool(false)
兩者還可以混用(建議別這麼做)
PHP 陣列可以同時包含 int 和 string 鍵,因為 PHP 不區分索引陣列(Indexed Array)
和關聯陣列(Associative Array)
$a = ['a' => 'air', 'banana', 'b' => 'bag', 'apple', 'c' => 'cat'];
print_r($a);
// [a] => air
// [0] => banana
// [b] => bag
// [1] => apple
// [c] => cat
key 會自動轉型成整數
$a1 = [1, 2, 3];
var_dump($a1);
// [0] => int(1)
// [1] => int(2)
// [2] => int(3)
$a2 = ['0' => 1, true => 2, 2.2 => 3];
var_dump($a2);
// [0] => int(1)
// [1] => int(2)
// [2] => int(3)
$a3 = ['01' => 1, '0.1' => 2, '1.2' => 3];
var_dump($a3); // 還是字串
// ["01"] => int(1)
// ["0.1"] => int(2)
// ["1.2"] => int(3)
var_dump($a1 === $a2); // bool(true)
var_dump($a1 == $a3); // bool(false)
增加元素
$a = ['a'];
// 不指定位置(新增到最後一個)
$a[] = 'b';
// 指定位置(可不照順序)
$a[2] = 'c';
// 解包(可新增在前方)
$a = [...$a, 'd'];
print_r($a); // ['a', 'b', 'c', 'd'];
讀取元素
// 索引陣列 Indexed Array
$a1 = ['a', 'b', 'c'];
echo $a1[2],"\n"; // c (陣列是從 0 開始數的)
// 關聯陣列 Associative Array
$a2 = ['a' => 'air', 'b' => 'bag', 'c' => 'cat'];
echo $a2[2], "\n"; // error
echo $a2['b'],"\n"; // bag
// 讀取多個元素
[$a3, $a4] = $a1;
echo $a3, "\n"; // a
echo $a4, "\n"; // b
// 指定 key
['1' => $a5, '2' => $a6] = $a1;
echo $a5, "\n"; // b
echo $a6, "\n"; // c
修改元素
$a = ['a', 'b', 'c'];
$a[2] = 'cat';
print_r($a); // ['a', 'b', 'cat'];
多維陣列
// 定義
$a = [
[
['aaa', 'aab'],
['aba', 'abb'],
],
[
['baa', 'bab'],
['bba', 'bbb'],
]
];
// 取值
echo $a[0][0][1], "\n"; // aab
echo $a[1][0][0], "\n"; // baa
比較運算子 | 說明 | 用法 |
---|---|---|
== |
相等(鍵 and 值) | x == y |
!= |
不相等(鍵 and 值) | x != y |
=== |
相等(順序 and 型別 and 鍵 and 值) | x === y |
!== |
不相等(順序 or 型別 or 鍵 or 值) | x !== y |
$a = [0 => 2, 1 => 3];
$b = [1 => 3, 0 => 2];
var_dump($a == $b); // bool(true) 相同鍵值對
var_dump($a === $b); // bool(false) 不同順序
$c = ["0" => 2, "1" => 3];
var_dump($a == $c); // bool(true)
var_dump($a === $c); // bool(true) 鍵自動轉型成整數
$d = [0 => "2", 1 => "3"];
var_dump($a == $d); // bool(true)
var_dump($a === $d); // bool(false) 值型別不同
合併運算子 | 說明 | 用法 |
---|---|---|
+ |
依照鍵合併陣列,如果有相同鍵則只保留 x 的值 | x + y |
$x = ['a', 'b', 'c'];
$y = ['air', 'bag', 'cat', 'dragon', 'egg'];
print_r($x + $y);
// [0] => a
// [1] => b
// [2] => c
// [3] => dragon
// [4] => egg
解包運算子 | 說明 | 用法 |
---|---|---|
... |
將陣列解包 | ...x |
解包是一個很方便的功能,而且速度比函式快,但有 key 時無法使用
// 解包連接
$a1 = ['a', 'b', 'c'];
$a2 = ['b', ...$a1, 'b'];
print_r($a2); // ['b', 'a', 'b', 'c', 'b']
// 解包覆蓋
$a3 = [...$a1, '1' => 'd'];
print_r($a3); // ['a', 'd', 'c']
// 特殊用法
$a4 = ['2' => 'd', ...$a1];
print_r($a4);
// [2] => d
// [3] => a
// [4] => b
// [5] => c
// 無法解包
$a5 = ['a' => 'air', 'b' => 'bag', 'c' => 'cat'];
$a6 = [...$a5]; // error
PHP 中的陣列無法用運算子做數學運算,也無法用運算子做集合運算
[1, 2, 3] - [1]; // error
[1, 2, 3] . [1]; // error
['a', 'b', 'c'] && ['a']; // true && true -> true
所以...又是一大堆的函式,或是只能自己刻
函式 | 說明 | 用法 |
---|---|---|
count() |
計算元素數量 | count($array) |
array_sum() |
加總數值(略過文字) | array_sum($array) |
array_pop() |
取出最後一個元素 | array_pop($array) |
array_push() |
增加元素 | array_push($array, $a, $b, ...) |
array_shift() |
取出第一個元素 | array_shift($array) |
array_unshift() |
在前方增加元素 | array_unshift($array, $a, $b, ...) |
array_splice() |
移除、新增元素 | array_splice($array, $start, $len, $a) |
array_slice() |
裁切陣列 | array_slice($array, $start, $len) |
array_merge() |
合併多個陣列 | array_merge($array1, $array2, ...) |
array_flip() |
鍵值交換 | array_flip($array) |
array_keys() |
返回陣列的鍵 | array_keys($array) |
array_values() |
返回陣列的值 | array_values($array) |
array_key_exists() |
檢查鍵是否存在 | array_key_exists($key, $array) |
in_array() |
檢查值是否存在 | in_array($value, $array) |
ksort() |
對鍵做排序 | ksort($array, $flags) |
sort() |
對值做排序 | sort($array, $flags) |
array_diff() |
差集 A - B |
array_diff($A, $B); |
array_intersect() |
交集 A & B |
array_intersect($A, $B); |
自己刻系列 union | 聯集 `A | B` |
自己刻系列 xor | 對稱差集 A ^ B |
[...array_diff($A, $B), ...array_diff($B, $A)]; |
所有陣列函式:https://www.php.net/manual/en/ref.array.php
其實有集合這個資料型態:https://www.php.net/manual/en/class.ds-set.php
用集合的話就可以不用自己刻,但你陣列都給集合運算了,不給完整是怎樣
全名 JavaScript Object Notation(JS 物件表示法),是一種特殊格式的字串,常被用於「檔案儲存」及「網路傳輸」
陣列與 JSON 可以互相轉換:
// Array -> JSON
$array = ['a' => 'air', 'b' => 'bag', 'c' => 'cat'];
$json = json_encode($array);
// JSON -> Array
$json = '{"a":"air","b":"bag","c":"cat"}';
$array = json_decode($json, true);
// 要加上第二個參數才會是陣列,否則會變成物件