【问题标题】:Merging two json in PHP在PHP中合并两个json
【发布时间】:2013-12-15 16:14:29
【问题描述】:

我有两个json

第一个是

    [{"COLUMN_NAME":"ORDER_NO","COLUMN_TITLE":"Order Number"}
,{"COLUMN_NAME":"CUSTOMER_NO","COLUMN_TITLE":"Customer Number"}]

第二个是

[{"COLUMN_NAME":"ORDER_NO","DEFAULT_VALUE":"1521"},
{"COLUMN_NAME":"CUSTOMER_NO","DEFAULT_VALUEE":"C1435"}]

我想合并它们并有一个像

这样的 json
[{"COLUMN_NAME":"ORDER_NO","COLUMN_TITLE":"Order Number","DEFAULT_VALUE":"1521"}
,{"COLUMN_NAME":"CUSTOMER_NO","COLUMN_TITLE":"Customer Number","DEFAULT_VALUEE":"C1435"}]

有没有办法合并它们?如果需要更改 JSON 的结构,我也可以

谢谢。

【问题讨论】:

  • 1 将它们转换为 php 数据结构 2 合并它们 3 转换回 json

标签: php json merge


【解决方案1】:

json_encode(array_merge(json_decode($a, true),json_decode($b, true))) 之类的东西应该可以工作。

array_merge 在 PHP 官方文档中

json_decode 在 PHP 官方文档中

编辑: 尝试将true 作为第二个参数添加到 json_decode。这会将对象转换为关联数组。

编辑 2:试试 array-merge-recursive 并在下面查看我的评论。抱歉现在必须退出 :( 这看起来像是一个完全正确的解决方案:https://stackoverflow.com/a/20286594/1466341

【讨论】:

  • 谢谢您的回答,但结果是 [{"COLUMN_NAME":"ORDER_NO","COLUMN_TITLE":"Order Number"},{"COLUMN_NAME":"CUSTOMER_NO","COLUMN_TITLE": "Customer Number"},{"COLUMN_NAME":"ORDER_NO","DEFAULT_VALUE":"1521"},{"COLUMN_NAME":"CUSTOMER_NO","DEFAULT_VALUE":"C1435"}] 它在后面添加第二个 json第一。是不是只能将缺少的键和值添加到第一个中。请看我的预期结果
  • 见我上面的编辑。这应该更接近您的需要,但我猜这将返回对象作为 JSON 中的编码数组作为结果(抱歉,现在没有时间测试):(
  • 它没有改变结果。它再次在前一个数组之后添加数组
  • 啊,我现在明白了。您必须像使用此函数us3.php.net/manual/en/function.array-merge-recursive.php 一样递归地合并元素,但要注意的是,当您在数组中有数字键时,它不会合并子元素。残酷的解决方案是首先解码所有 json,然后将它们的子元素一个接一个地合并到循环中,然后将结果编码为 json。抱歉,现在必须退出 :(
  • 就像我说的 - 这看起来像下面的正确解决方案:stackoverflow.com/a/20286594/1466341
【解决方案2】:

设法把它放在一起。很可能有更好的解决方案,但这是我得到的最接近的解决方案。

$a = '[{"COLUMN_NAME":"ORDER_NO","COLUMN_TITLE":"Order Number"},{"COLUMN_NAME":"CUSTOMER_NO","COLUMN_TITLE":"Customer Number"}]';
$b = '[{"COLUMN_NAME":"ORDER_NO","DEFAULT_VALUE":"1521"},{"COLUMN_NAME":"CUSTOMER_NO","DEFAULT_VALUEE":"C1435"}]';
$r = [];
foreach(json_decode($a, true) as $key => $array){
 $r[$key] = array_merge(json_decode($b, true)[$key],$array);
}
echo json_encode($r);

返回,

[{"COLUMN_NAME":"ORDER_NO","DEFAULT_VALUE":"1521","COLUMN_TITLE":"Order Number"},
{"COLUMN_NAME":"CUSTOMER_NO","DEFAULT_VALUEE":"C1435","COLUMN_TITLE":"Customer Number"}]

【讨论】:

    【解决方案3】:

    这对我来说就像一个魅力

    json_encode(array_merge(json_decode($a, true),json_decode($b, true)))
    

    这是一个完整的例子

    $query="SELECT * FROM `customer` where patient_id='1111118'";
    
    $mysql_result = mysql_query($query);
    
    $rows = array();
    while($r = mysql_fetch_assoc($mysql_result)) {
        $rows[] = $r;
    }
    $json_personal_information=json_encode($rows);
    //echo $json_personal_information;
    
    
    
    
    $query="SELECT * FROM `doctor` where patient_id='1111118'";
    
    $mysql_result = mysql_query($query);
    
    $rows = array();
    while($r = mysql_fetch_assoc($mysql_result)) {
        $rows[] = $r;
    }
    $json_doctor_information=json_encode($rows);
    //echo $json_doctor_information;
    
    echo $merger=json_encode(array_merge(json_decode($json_personal_information, true),json_decode($json_doctor_information, true)));
    

    【讨论】:

    • 我一定错过了什么。第二个编码不会覆盖第一个吗?
    • @GaryCarlyleCook 因为在每个 while 循环之后,$rows 的结果存储到不同的变量($json_personal_information 和 $json_doctor_information)。这两个变量在array_merge中使用。
    【解决方案4】:

    这对我有用!

    $dados1 = json_encode(array('data'=>'1')); 
    $dados2 = json_encode(array('data2'=>'2')); 
    echo json_encode(array_merge(json_decode($dados1, true),json_decode($dados2, true)));
    

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2021-11-21
      • 2021-12-02
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多