Skip to content

数组运算符

数组也能做运算:联合、比较是否相等。它们和数字的 +== 长得一样,规则完全不同。请先熟悉 数组 再读本篇。

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, Git

PHP 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,用 + 之前先写测试确认谁覆盖谁

练习

  1. $a = ["a" => 1, "b" => 2]$b = ["b" => 9, "c" => 3],分别 print_r($a + $b)print_r($b + $a),写出两次结果。
  2. [1, 2][1, "2"] 分别 var_dump =====
  3. ...["PHP"]["HTML", "SQL"] 合成一个新列表。
  4. 解释为什么 $arr = [0 => "A"]; $arr = $arr + [0 => "B"]; 之后仍是 "A",并改成能得到 "B" 的写法。

上一篇:数组
下一篇:超全局变量

基于 VitePress 构建的 PHP 基础学习指南