如何在PHP中合并两个包含results键的JSON数组?
如何合并两个查询结果的JSON数组
看起来你是想把两个数据库查询返回的分类结果合并成一个统一的JSON结构,之前用array_combine的思路走偏了,咱们来一步步解决这个问题:
问题分析
你现在有两个数组$array1和$array2,它们都包含一个results键,对应的值是分类数据的数组。你的目标是把这两个results里的所有元素合并到同一个results数组下,再输出正确的JSON。
错误原因
你之前使用的array_combine()函数是用来将一个数组的元素作为键,另一个数组的元素作为值来创建新数组,这和你需要合并数组元素的需求完全不匹配,所以才会得到错误的结果。
正确解决方案
我们需要先获取两个查询的结果数组(注意不要在每个查询后直接输出JSON,否则会先输出两个独立的JSON串,没法合并),然后用array_merge()合并两个results数组,最后再编码输出:
第一步:修改查询代码,去掉中间的JSON输出
首先处理第一个查询,保留数组但不输出:
$query2 = "SELECT DISTINCT cat_id,cat_name FROM review WHERE user_id = ? AND public_or_private = 0"; $stmt2 = $con->prepare($query2) or die(mysqli_error($con)); $stmt2->bind_param('i', $user_id) or die ("MySQLi-stmt binding failed ".$stmt2->error); $stmt2->execute() or die ("MySQLi-stmt execute failed ".$stmt2->error); $result2 = $stmt2->get_result(); $array1 = array(); while ($row = mysqli_fetch_assoc($result2)) { $array1['results'][] = $row; } // 移除这里的echo json_encode($array1);
然后处理第二个查询,同样保留数组:
$query3 = "SELECT DISTINCT cat_id,cat_name FROM review WHERE public_or_private = 2"; $result3 = mysqli_query($con,$query3); $array2 = array(); while($row = mysqli_fetch_assoc($result3)) { $array2['results'][] = $row; } // 移除这里的echo json_encode($array2);
第二步:合并数组并输出最终JSON
使用array_merge()把两个results数组的元素合并,然后生成最终的JSON:
// 合并两个results数组,将$array2的元素追加到$array1的元素后面 $combinedResults = array_merge($array1['results'], $array2['results']); // 构建目标结构的数组 $finalArray = array( 'results' => $combinedResults ); // 输出最终的JSON echo json_encode($finalArray);
额外说明
- 如果其中一个查询没有返回结果(比如
$array1['results']是空数组),array_merge()也能正常工作,会直接返回另一个数组的内容。 - 如果你想避免两个查询之间出现重复的
cat_id,可以在合并后用以下方式去重(针对多维数组):
// 合并后去重 $uniqueResults = array_map("unserialize", array_unique(array_map("serialize", $combinedResults))); $finalArray = array('results' => $uniqueResults); echo json_encode($finalArray);
内容的提问来源于stack exchange,提问作者CHarris
相关产品推荐
相关产品推荐

