主题
数组运算符
数组也能做运算:联合、比较是否相等。它们和数字的 +、== 长得一样,规则完全不同。请先熟悉 数组 再读本篇。
php
<?php
$a = ["a" => 1, "b" => 2];
$b = ["b" => 99, "c" => 3];
print_r($a + $b);
var_dump($a == $b);一览
| 运算符 | 名称 | 含义 |
|---|---|---|
+ | 联合(union) | 把右边「左边没有的键」补进去;左边已有的键保持左边的值 |
== | 相等 | 键和值相同即可,不要求顺序;值按宽松比较 |
=== | 全等 | 键、值、类型、顺序都相同 |
!= / <> | 不等 | == 的否定 |
!== | 不全等 | === 的否定 |
取下标 $arr["k"]、追加 $arr[] =、展开 ...$arr 也常和数组一起用,下面一并对照。
联合 +
$a + $b 得到新数组:先放 $a 的全部元素,再把 $b 里键尚不存在的元素补上。
php
<?php
$defaults = ["lang" => "zh", "theme" => "light"];
$custom = ["theme" => "dark"];
print_r($defaults + $custom);
// lang => zh, theme => light
// 「theme」左边已有,右边的 dark 被丢掉
print_r($custom + $defaults);
// theme => dark, lang => zh和 array_merge 正好相反:array_merge($defaults, $custom) 里后面的 theme => dark 会覆盖前面。
数字键同样按「键在不在」判断,不会重新编号:
php
<?php
$a = [0 => "PHP", 1 => "HTML"];
$b = [0 => "SQL", 2 => "Git"];
print_r($a + $b);
// 0 => PHP (左边留下)
// 1 => HTML
// 2 => Git (右边新键)
// 「SQL」进不来,因为键 0 已存在array_merge($a, $b) 则会把数字键重排成 PHP, HTML, SQL, Git。列表首尾相接请用 array_merge 或 ...,不要用 +。
+ 适合「缺省配置 + 用户覆盖」吗?不适合,因为它保留的是左边。缺省在左、用户在右时,用户改不掉已有键。这种场景用 array_merge($defaults, $custom) 或后面的展开。
本指南:
- 拼列表:
[...$a, ...$b]或array_merge - 覆盖配置:
array_merge($defaults, $custom) +:只在你确实要「左边优先、按键去重」时使用
相等 == 与全等 ===
php
<?php
$a = ["x" => 1, "y" => 2];
$b = ["y" => 2, "x" => 1];
$c = ["x" => 1, "y" => "2"];
var_dump($a == $b); // true,键值相同,顺序无关
var_dump($a === $b); // false,顺序不同
var_dump($a == $c); // true,2 == "2"
var_dump($a === $c); // false,类型不同索引数组同理:[1, 2] == [1, "2"] 为 true,=== 为 false。
嵌套数组会递归比较。只要某层按对应规则不相等,整表就不相等。
空数组:
php
<?php
var_dump([] == []); // true
var_dump([] === []); // true
var_dump([] == false); // true,宽松比较把空数组当成假
var_dump([] === false); // false判断「有没有元素」用 === [] 或 count($arr) === 0,不要用 == false。比较规则总表见 比较运算符。
下标与追加
| 写法 | 作用 |
|---|---|
$arr[$key] | 读取或写入指定键 |
$arr[] = $value | 在下一个整数键追加 |
isset($arr[$key]) | 键存在且值不是 null |
php
<?php
$langs = ["PHP"];
$langs[] = "HTML";
$langs[0] = "PHP8";
echo $langs[0], "\n";两边都是数组时,+ 才是联合;一边是数字会按算术加,PHP 8 会 TypeError:
php
<?php
$arr = [1, 2];
// $arr + 1; // TypeError: Unsupported operand types: array + int不要用 + 往数组里「加一个元素」,追加用 $arr[] =。
展开 ...
PHP 7.4 起,在数组字面量里展开另一个数组(数字键会重排,类似 array_merge):
php
<?php
$a = ["PHP", "HTML"];
$b = ["SQL"];
$all = [...$a, ...$b, "Git"];
print_r($all); // PHP, HTML, SQL, GitPHP 8.1 起允许展开带字符串键的数组,冲突时后面覆盖前面:
php
<?php
$defaults = ["lang" => "zh", "theme" => "light"];
$custom = ["theme" => "dark"];
$config = [...$defaults, ...$custom];
print_r($config); // lang => zh, theme => dark这是现在写「合并配置」最直观的方式。... 不是官方「数组运算符」那一张表里的符号,但日常比 + 常用得多。
和 array_merge 对照
php
<?php
$a = [0 => "左"];
$b = [0 => "右", "k" => 1];
print_r($a + $b); // 0 => 左, k => 1
print_r(array_merge($a, $b)); // 0 => 左, 1 => 右, k => 1
print_r([...$a, ...$b]); // 与 array_merge 类似+ | array_merge / ... | |
|---|---|---|
| 数字键冲突 | 保留左边,不重排 | 重新编号,两边都留下 |
| 字符串键冲突 | 保留左边 | 右边覆盖左边 |
| 典型用途 | 少用;「左优先补缺」 | 拼列表、合并配置 |
书写建议
- 看见数组旁边的
+,先当成联合,不要当成算术 - 比较两个数组是否「长得一样」用
===;只要键值不管顺序、不管"2"和2,才用== - 追加元素用
$arr[] =,不要$arr = $arr + [$x](键冲突时会丢数据) - 合并优先
...或array_merge,用+之前先写测试确认谁覆盖谁
练习
$a = ["a" => 1, "b" => 2],$b = ["b" => 9, "c" => 3],分别print_r($a + $b)和print_r($b + $a),写出两次结果。- 对
[1, 2]与[1, "2"]分别var_dump==和===。 - 用
...把["PHP"]和["HTML", "SQL"]合成一个新列表。 - 解释为什么
$arr = [0 => "A"]; $arr = $arr + [0 => "B"];之后仍是"A",并改成能得到"B"的写法。