在 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"
}
]
我想唯一地合并 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"
}
]