【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);
// 要加上第二个参数才会是阵列,否则会变成物件

<<:  [FGL] 目录档案处理-处理谁的档案? frontCall

>>:  day9: CSS style 规划 - CSS in JS(emotion 使用 - 3)

D21 - 「不断线的侏罗纪」:萃取 DNA

这个章节开始我们要重现 Chrome 浏览器离线时出现的小游戏「Dinosaur Game」,首先来...

WordPress外挂总小小整理

详细可以参考这个网站页面的整理,下面是我协杠玩WordPress半年来的心得 https://109...

02 - Elastic 的 Observability 解决方案

本篇学习重点 了解 Elastic 针对 observability 的观点 初探 Elastic ...

[Day 30] 使用ChromeDriver来做单元测试(三)

同时开启多个浏览器 有时候可能需要多个浏览器来进行测试, 譬如说用多个浏览器来测试WebSocket...

Day 18:为你的 Hexo 部落格文章添加文章字数与所需阅读时间

今天要实作的内容,能够为自己的 Hexo 部落格文章增加提示本篇文章所需字数以及所需阅读时间,能够帮...