iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Software Development

用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!系列 第 15

【PHP Telegram Bot】Day15 - 基礎(4):陣列處理、JSON

陣列就像是個大櫃子,可以存放好多好多的東西

陣列賦值、取值

可以由兩種格式產生(兩者相等):

$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 [...array_diff($A, $B), ...$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

用集合的話就可以不用自己刻,但你陣列都給集合運算了,不給完整是怎樣


JSON

全名 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);
// 要加上第二個參數才會是陣列,否則會變成物件

上一篇
【PHP Telegram Bot】Day14 - 基礎(3):字串處理與正規表示式
下一篇
【PHP Telegram Bot】Day16 - 基礎(5):檔案讀取與寫入、cURL
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30

尚未有邦友留言

立即登入留言