PHP数组合并、拼接详解

PHP中数组的功能非常强大,这里的“数组”与其它语言如Python、C/C++、Java中的"数组"不一样,它既可以用作传统数组(类似于Python中List,C++中Vector,Java中Array),也可以用作关联数组(类似于Python中Dictionary,C++中Map,Java中Map)。当然也可以把传统数组当成key是从0开始递增整数的关联数组,从而认为PHP中没有传统数组。 在操作数组的过程中,数组合并是经常遇到的需求,PHP中提供了array_merge和数组直接相加两种方法。

 $result = array_merge($a, $b, $c);
 $result = $a + $b + $c;

array_merge

按下面的规则合并数组:

  • 输入数组中所有数值类型的键(key)会重新排序、指定新的键(key)--从0开始的整数。
  • 如果待合并的元素的key是数值类型,将该元素直接追加到结果数组中。
  • 如果代合并的元素的key是字符串且结果数组中并没有该key,添加这对keyvalue到结果数组中。
  • 如果代合并的元素的key是字符串且结果数组中存在该key,则用新值覆盖结果集中已有的值。

直接相加

按下面的规则合并数组:

  • 所有输入数组都被当做关联数组,并为没有key的元素,指定递增整数key
  • 如果待合并元素的key在结果集中存在,直接忽略掉新元素,保留原值。
  • 如果待合并元素的key在结果集中不存在,添加这对keyvalue到结果数组中。

示例

下面用例子来验证一下上述规则。

数组未定义键值(key)

如前所述,未定义键值也可认为有从0开始的整数键值。

$a = array(1,2,3);
$b = array(3,4,5);
$c = array_merge($a, $b);
$d = $a + $b;
var_dump($c);
var_dump($d);

输出如下:

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

数组键值(key)为数字

$a = array(
    1 => 1,
    2 => 2,
    3 => 3
);
$b = array(
    2 => 3,
    3 => 4,
    4 => 5
);
$c = array_merge($a, $b);
$d = $a + $b;
var_dump($c);
var_dump($d);

输出如下:

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
}
array(4) {
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(5)
}

注意array_merge对所有数字键值(key)进行了重排,但是数组相加沿用之前的键。

键值(key)的定义是数值字符串

这里键值的定义是字符串,但是实际上array_merge数组相加都把它当成数值处理。

$a = array(
    "1" => 1,
    "2" => 2,
    "3" => 3
);
$b = array(
    "2" => 3,
    "3" => 4,
    "4" => 5
);
$c = array_merge($a, $b);
$d = $a + $b;
var_dump($c);
var_dump($d);

输出如下:

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
}
array(4) {
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(5)
}

数组以字符串为键值(key)

$a = array(
    "a1" => 1,
    "a2" => 2,
    "a3" => 3
);
$b = array(
    "a2" => 3,
    "a3" => 4,
    "a4" => 5
);
$c = array_merge($a, $b);
$d = $a + $b;
var_dump($c);
var_dump($d);

输出如下:

array(4) {
  ["a1"]=>
  int(1)
  ["a2"]=>
  int(3)
  ["a3"]=>
  int(4)
  ["a4"]=>
  int(5)
}
array(4) {
  ["a1"]=>
  int(1)
  ["a2"]=>
  int(2)
  ["a3"]=>
  int(3)
  ["a4"]=>
  int(5)
}

数组键值(key)既有数字也有字符串

应用中这类数组比较少,仅用于比较array_merge数字相加

$a = array(
    1 => 1,
    2 => 2,
    3 => 3,
    "a1" => 1,
    "a2" => 2,
    "a3" => 3
);
$b = array(
    2 => 3,
    3 => 4,
    4 => 5,
    "a2" => 3,
    "a3" => 4,
    "a4" => 5
);
$c = array_merge($a, $b);
$d = $a + $b;
var_dump($c);
var_dump($d);

输出如下:

array(10) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  ["a1"]=>
  int(1)
  ["a2"]=>
  int(3)
  ["a3"]=>
  int(4)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
  ["a4"]=>
  int(5)
}
array(8) {
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  ["a1"]=>
  int(1)
  ["a2"]=>
  int(2)
  ["a3"]=>
  int(3)
  [4]=>
  int(5)
  ["a4"]=>
  int(5)
}

本文所有示例输出均运行在PHP 7.0.28上。