【问题标题】:how to merge two json array or string in php如何在php中合并两个json数组或字符串
【发布时间】:2017-03-21 14:32:17
【问题描述】:

我有两个 json 数组 a 和 b。目的是将其合并为一个,因为“a”在数据库中,“b”来自输入表单,以将表单数组与数据库数组相加,并在 db 中保持格式。

a = {"1":"A","2":"V","3":"C"} b = {"1":"X","2":"XL","3":"XM","4":"L"}

我的目标是得到类似“c”的东西

c= {"1":"A","2":"V","3":"C","4":"X","5":"XL","6": "XM","7":"L"}

我做了一个合并函数,得到 ["A","V","C","X","XL","XM","L"] 接近

$a= '{"1":"A","2":"V","3":"C"}';
$b = $_POST['a'];// '{"1":"X","2":"XL","3":"XM","4":"L"}'
            echo $c = json_encode(array_merge(array_filter($a),json_decode($b, true)));

【问题讨论】:

    标签: php arrays json string


    【解决方案1】:

    如果你的 json 字符串有数字键:

    echo json_encode((object)(array_merge(json_decode('{"1":"A","2":"V","3":"C"}', true), json_decode('{"1":"X","2":"XL","3":"XM","4":"L"}', true))));
    

    这个key从0开始,如果想从1开始,使用array_keys和array_values来获取key和value。然后使用 array_map 为每个键加 1。最后使用 array_combine 从 1 获取数组索引。

    $array = array_merge(json_decode('{"1":"A","2":"V","3":"C"}', true), json_decode('{"1":"X","2":"XL","3":"XM","4":"L"}', true));
    $keys = array_map(function($v){return $v + 1;}, array_keys($array));
    $values = array_values($array);
    echo json_encode((object)array_combine($keys, $values));
    

    结果:

    {"1":"A","2":"V","3":"C","4":"X","5":"XL","6":"XM","7":"L"}
    

    如果不是数字键,则在 array_merge 之前使用 array_values。

    如果要删除重复项,请在 array_merge 之后使用 array_unique。

    【讨论】:

    • 这个和我的一模一样
    • 谢谢,你看,它有效,但是从 0 开始计数,让它从 1 开始,就像我的示例 c, c= {"1":"A","2":"V ","3":"C","4":"X","5":"XL","6":"XM","7":"L"}
    • @EmeldaOnn 立即查看。
    • 这太棒了,完美,问题解决了!哥给你一杯咖啡!
    【解决方案2】:
    $a = '{"1":"A","2":"V","3":"C"}';
    $b = '{"1":"X","2":"XL","3":"XM","4":"L"}';
    
    $a = json_decode($a,true);
    $b = json_decode($b,true);
    
    print_r(array_merge($a,$b));
    

    json_decode 会返回 stdObject

    如果你想从 json 字符串数组,你需要传递 true 作为第二个参数来获取数组格式的值


    编辑

    $a = '{"1":"A","2":"V","3":"C"}';
    $b = '{"1":"X","2":"XL","3":"XM","4":"L"}';
    
    $a = json_decode($a,true);
    $b = json_decode($b,true);
    
    
    print_r(array_merge_recursive($a,$b));
    

    array_merge_recursive 永远不会跳过相同的索引

    array_merge 将跳过相同的索引

    【讨论】:

    • 这仍然返回与我相同的结果
    • @EmeldaOnn 回答。更新请检查并告诉我
    【解决方案3】:

    Array_push 将元素添加到末尾:

    $a= '{"1":"A","2":"V","3":"C"}';
    $b = $_POST['a'];// '{"1":"X","2":"XL","3":"XM","4":"L"}'
                echo $c = json_encode(array_push(array_filter($a),json_decode($b, true)));
    

    【讨论】:

      【解决方案4】:

      您尝试做的事情是不寻常的,我认为您将不得不编写比您想要的代码更多的代码。

      一方面,您希望键是字符串标识符而不是数字(您不喜欢 array_merge 给您的内容),但在另一方面,您希望它们被重写以按照整数索引的方式顺序继续。

      这种设计选择可能对您来说是必要的,但它会花费您很多,因为大多数标准数组函数不会按照您希望的方式工作。在这种情况下,您需要自己编写大量代码,而不是使用预先构建的、经过验证的快速库函数。

      我建议您仔细检查在索引中需要这种非标准方法的原因,看看是否最好更改它。

      【讨论】:

        【解决方案5】:

        这可能对你有帮助:

        $a = '{"1":"A","2":"V","3":"C"}'; $b = '{"1":"X","2":"XL","3":"XM","4":"L"}'; $c = array_merge(array_filter(json_decode($a,true)),json_decode($b, true)); foreach($c as $key => $value){ $d[$key+1] = $值; } 回声 json_encode($d);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-12
          • 2019-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-24
          相关资源
          最近更新 更多