阵列就像是个大柜子,可以存放好多好多的东西
可以由两种格式产生(两者相等):
$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
用集合的话就可以不用自己刻,但你阵列都给集合运算了,不给完整是怎样
全名 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)
这个章节开始我们要重现 Chrome 浏览器离线时出现的小游戏「Dinosaur Game」,首先来...
详细可以参考这个网站页面的整理,下面是我协杠玩WordPress半年来的心得 https://109...
本篇学习重点 了解 Elastic 针对 observability 的观点 初探 Elastic ...
同时开启多个浏览器 有时候可能需要多个浏览器来进行测试, 譬如说用多个浏览器来测试WebSocket...
今天要实作的内容,能够为自己的 Hexo 部落格文章增加提示本篇文章所需字数以及所需阅读时间,能够帮...