array_merge() 将一个或多个数组合并为单一数组,字符串键后者覆盖前者,数字键重新索引。本文演示多数据源查询结果合并的典型场景与注意事项。
<?php
// 假设 $dblink 为数据库连接对象,mem_fetch_array 返回关联数组
// 查询条件 1: t_pid 为 3 或 6
$arr1 = $dblink->mem_fetch_array(
"SELECT t_pid, imgname, invented, score FROM t_sum_giftimg WHERE t_pid=3 OR t_pid=6",
0
);
// 查询条件 2: t_pid 为 10 或 12
$arr2 = $dblink->mem_fetch_array(
"SELECT t_pid, imgname, invented, score FROM t_sum_giftimg WHERE t_pid=10 OR t_pid=12",
0
);
// 合并结果集 (数字键重新索引 0,1,2...)
$imgInfo = array_merge($arr1, $arr2);
// 统一格式化输出
if ($imgInfo) {
foreach ($imgInfo as $row) {
$imgs[] = $row; // 可直接使用,键已重置
}
}
?>
| 键类型 | 合并行为 | 示例 |
|---|---|---|
| 数字键 (0,1,2...) | 重新索引,不覆盖 | [a,b] + [c,d] → [a,b,c,d] |
| 字符串键 ('name') | 后者覆盖前者 | ['x'=>1] + ['x'=>2] → ['x'=>2] |
| 混合键 | 分别应用上述规则 | - |
<?php
$a = ['name' => 'A', 0 => 'first'];
$b = ['name' => 'B', 1 => 'second'];
print_r(array_merge($a, $b));
/*
Array (
[name] => B // 字符串键覆盖
[0] => first // 数字键重新索引
[1] => second
)
*/
print_r($a + $b);
/*
Array (
[name] => A // 字符串键保留首个
[0] => first // 数字键保留首个
[1] => second // $a 中无键 1,保留 $b
)
*/
?>
$merged = array_merge($arr1, $arr2, $arr3, $arr4);
// 或配合解包 (PHP 7.4+)
$arrays = [$arr1, $arr2, $arr3];
$merged = array_merge(...$arrays);
$a = [5 => 'a', 8 => 'b'];
$b = [3 => 'c'];
// 使用 + 运算符
$result = $a + $b; // [5=>'a', 8=>'b', 3=>'c']
$a = ['user' => ['name' => 'A', 'tags' => ['php']]];
$b = ['user' => ['email' => 'a@b.com', 'tags' => ['go']]];
print_r(array_merge_recursive($a, $b));
/*
Array (
[user] => Array (
[name] => A
[email] => a@b.com
[tags] => Array ( [0] => php, [1] => go ) // 同键数组合并
)
)
*/
$imgs = [...$arr1, ...$arr2]; // 展开运算符,保留键
// 或
$imgs = array_merge($arr1, $arr2); // 标准合并,重置键
array_merge 创建新数组,内存峰值 = 合并后大小 + 原数组大小Generator + iterator_to_array 或直接迭代处理UNION ALL 在 SQL 层合并,减少 PHP 内存压力array_merge((array)$a, (array)$b)