在 php 中唯一地合并 json 数据

merge json data uniquely in php

我想唯一地合并 json 数据。我有两个 json 数据,需要一个以独特方式包含两个 json 数据的结果 json 数据。

$json1 = '[{"name":"A1","phone":"123"}, {"name":"A2","phone":"456"}]';
$json2 = '[{"name":"A1","phone":"123"}, {"name":"A3","phone":"789"}]';

$decoded_json1 = json_decode($json1, true);
$decoded_json2 = json_decode($json2, true);

var_dump($decoded_json1);
var_dump($decoded_json2);

$merge_json = array_merge($decoded_json1, $decoded_json2);

var_dump($merge_json);

/* I want json data like this
[{"name":"A1","phone":"123"}, {"name":"A2","phone":"456"}, {"name":"A3","phone":"789"}]
 */

但是上面的代码不能很好地合并 json 数据,但问题是它不是唯一的这个对象 {"name":"A1","phone":"123"} 重复。

更新:

  $json2 = '[{"name":"A1","phone":"123"}, {"name":"A3","phone":"789"}, {"name":"A1","phone":"000"}]'; 

PHP 不会知道什么是独特的,什么不是,您将需要手动执行此操作。

code

<?php

$json1 = '[{"name":"A1","phone":"123"}, {"name":"A2","phone":"456"}]';
$json2 = '[{"name":"A1","phone":"123"}, {"name":"A3","phone":"789"}]';

$decoded_json1 = json_decode($json1, true);
$decoded_json2 = json_decode($json2, true);

$newArray = [];

foreach($decoded_json1 as $row) {
    $hash = hash('SHA256', json_encode($row));
    $newArray[$hash] = $row;
}

foreach($decoded_json2 as $row) {
    $hash = hash('SHA256', json_encode($row));
    $newArray[$hash] = $row;
}

// remove the hash keys
$newArray = array_values($newArray);

var_dump($newArray);

output

array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(2) "A1"
    ["phone"]=>
    string(3) "123"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(2) "A2"
    ["phone"]=>
    string(3) "456"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(2) "A3"
    ["phone"]=>
    string(3) "789"
  }
}

array_merge() 只过滤重复的关键成员,因此您可以使用 json_encode()json_decode()array_unique() 来做:

$tmp = array_map('json_encode', $merge_json); // Encode everyone array members.
$tmp = array_unique($tmp); // Filter duplicated
$tmp = array_values($tmp); // Re generate array indexes
$tmp = json_encode($tmp);
echo $tmp;

结果:

[{"name":"A1","phone":"123"}","{"name":"A2","phone":"456"}","{"name":"A3","phone":"789"}]

试试这个:

更新:

$json1 = '[{"name":"A1","phone":"123"}, {"name":"A2","phone":"456"}]';
$json2 = '[{"name":"A1","phone":"123"}, {"name":"A3","phone":"789"},    {"name":"A1","phone":"000"}]';
$array = array_unique(array_merge(json_decode($json1, true), json_decode($json2, true)), SORT_REGULAR);

function data_uniquely($key, $array) {
   $_array = array();
   foreach ($array as $v) {
      if (isset($_array[$v[$key]]))
         continue;
      $_array[$v[$key]] = $v;
   }
   $array = array_values($_array);
   return json_encode($array);
}
$json = data_uniquely('name', $array);
echo $json;

Json 结果:

[
 {
   "name": "A1",
   "phone": "123"
 },
 {
   "name": "A2",
   "phone": "456"
 },
 {
   "name": "A3",
   "phone": "789"
 }
]