PHP如何合并数组?如何将同列结构的多组数组合并为一个?
PHP数组合并方法及多查询结果合并方案
嘿,针对你的问题,我来一步步帮你解决!首先先讲PHP里通用的数组合并方法,再结合你多表查询的场景给出最优方案。
一、PHP常用的数组合并方法
下面是几种常见的数组合并方式,适用于不同场景:
array_merge():最常用的合并函数,能合并多个数组。对于索引数组,会重新生成连续的索引;对于关联数组,如果键名重复,后面数组的值会覆盖前面的。
示例:$arr1 = [1, 2, 'name' => 'Alice']; $arr2 = [3, 'name' => 'Bob']; $merged = array_merge($arr1, $arr2); // 结果:[1,2,3, 'name' => 'Bob']- 加号运算符
+:和array_merge()不同,不管是索引还是关联数组,键名重复时会保留第一个数组的对应值。
示例:$arr1 = [1, 2, 'name' => 'Alice']; $arr2 = [3, 'name' => 'Bob']; $merged = $arr1 + $arr2; // 结果:[1,2, 'name' => 'Alice'] array_merge_recursive():遇到重复键名时,不会覆盖值,而是将多个值合并成一个子数组,适合需要保留所有重复键值的场景。
二、针对你多表查询结果的合并方案
你的场景是从多个结构相同的表中查询数据,然后合并成一个数组,这里有两种高效的解决方式:
方案1:用array_merge()循环合并查询结果
如果想保留现有代码的结构,只需要把每个表的查询结果合并即可:
// 你的原查询代码 $stmt1 = $pdo->prepare('SELECT * FROM `formsone`'); $stmt1->execute(); $applications1 = $stmt1->fetchAll(); $stmt2 = $pdo->prepare('SELECT * FROM `formstwo`'); $stmt2->execute(); $applications2 = $stmt2->fetchAll(); $stmt3 = $pdo->prepare('SELECT * FROM `formsthree`'); $stmt3->execute(); $applications3 = $stmt3->fetchAll(); // 合并所有结果 $allApplications = array_merge($applications1, $applications2, $applications3);
如果表更多,建议用循环简化代码,避免重复冗余:
// 定义所有要查询的表名 $tables = ['formsone', 'formstwo', 'formsthree', 'formsfour']; $allApplications = []; foreach ($tables as $table) { $stmt = $pdo->prepare("SELECT * FROM `$table`"); $stmt->execute(); // 逐个合并结果 $allApplications = array_merge($allApplications, $stmt->fetchAll()); }
方案2:用SQL的UNION ALL一次查询(更高效)
既然所有表结构完全相同,推荐直接用SQL的UNION ALL把多个表的数据合并后再查询,这样只需要和数据库交互一次,减少开销:
$tables = ['formsone', 'formstwo', 'formsthree', 'formsfour']; // 拼接UNION ALL查询语句 $sqlParts = array_map(function($table) { return "SELECT * FROM `$table`"; }, $tables); $sql = implode(' UNION ALL ', $sqlParts); $stmt = $pdo->prepare($sql); $stmt->execute(); // 直接得到合并后的所有数据 $allApplications = $stmt->fetchAll();
注意:
UNION ALL会保留所有重复行,如果需要去重可以换成UNION,但UNION会有额外的排序去重开销,你的场景如果不需要去重,用UNION ALL更高效。
内容的提问来源于stack exchange,提问作者Lin Aung
相关产品推荐
相关产品推荐

