在PHP中从json数组中删除重复值
我在此质疑: 但我需要修改 我有一些类似于:在PHP中从json数组中删除重复值,php,arrays,json,Php,Arrays,Json,我在此质疑: 但我需要修改 我有一些类似于: Array ( [0] => {"name":"John", "surname":"Smith"}, {"name":"Kate", "surname":"Winston"}, [1] => {"name":"Kate", "surname":"Winston"}, {"name":"Jack", "surname":"Irving"} ) 我要删除重复项,并且此结果: Array ( [0] => {"name":
Array (
[0] => {"name":"John", "surname":"Smith"}, {"name":"Kate", "surname":"Winston"},
[1] => {"name":"Kate", "surname":"Winston"}, {"name":"Jack", "surname":"Irving"}
)
我要删除重复项,并且此结果:
Array (
[0] => {"name":"John", "surname":"Smith"},
[1] => {"name":"Jack", "surname":"Irving"},
)
将元素收集到新数组中,其中唯一键为
name\u姓氏
数组(
[“约翰史密斯”]=>{“姓名”:“约翰”,“姓氏”:“史密斯”},
[“杰克文”]=>{“姓名”:“约翰”,“姓氏”:“史密斯”}
}
如果你不像你在评论中所说的那样删掉括号,[]
,那就更容易了。这样,它们就是正确的JSON字符串,我们可以在PHP中使用
将(或循环)映射到数组上,并构建一个$result
数组,在该数组中附加解码后的JSON中的所有数组。一旦获得最终的$result
,就有了一个类似于
Array (
[0] => Array
(
[name] => John
[surname] => Smith
)
[1] => Array
(
[name] => Kate
[surname] => Winston
)
[2] => Array
(
[name] => Kate
[surname] => Winston
)
[3] => Array
(
[name] => Jack
[surname] => Irving
)
)
我们现在在一个实际数组中有了所有的值,但也有重复的值——可以使用带有SORT\u REGULAR
标志的array\u unique()
删除这些值
$array = [
'[{"name":"John", "surname":"Smith"}, {"name":"Kate", "surname":"Winston"}]',
'[{"name":"Kate", "surname":"Winston"}, {"name":"Jack", "surname":"Irving"}]'
];
$result = [];
array_map(function($v) use (&$result) {
$result = array_merge($result, json_decode($v, true));
}, $array);
print_r(array_unique($result, SORT_REGULAR));
最终输出:
Array
(
[0] => Array
(
[name] => John
[surname] => Smith
)
[1] => Array
(
[name] => Kate
[surname] => Winston
)
[3] => Array
(
[name] => Jack
[surname] => Irving
)
)
- 现场演示
Array
(
[KateWinston] => stdClass Object
(
[name] => Kate
[surname] => Winston
)
[JackIrving] => stdClass Object
(
[name] => Jack
[surname] => Irving
)
)
可以将其改写为更严肃的代码)似乎其他答案看不到自己的最终结果,也看不到所需的输出 这里有一个有点难的解决方案,但效果很好 注意:输入数据数组必须有2个对象索引和2个用于比较的对象数组,否则应该是固定的 给出结果:
Array
(
[0] => Array
(
[John] => Smith
)
[1] => Array
(
[Jack] => Irving
)
)
在您可以重新创建输出阵列之后:
// creating a new array
$res = [];
foreach($diff as $num=>$ns){
foreach($ns as $name=>$surname){
foreach($keys as $ind=>$key){
if ($ind % 2 == 0){
$tmp[$key] = $name; // put name
} else {
$tmp[$key] = $surname; // put surname
}
}
$res[$num] = (object)$tmp; // array to object
}
}
输出将是:
Array
(
[0] => stdClass Object
(
[name] => John
[surname] => Smith
)
[1] => stdClass Object
(
[name] => Jack
[surname] => Irving
)
)
对于输入数组中的字符串值,即:
$ar = [
'[{"name":"John", "surname":"Smith"}, {"name":"Kate", "surname":"Winston"}]',
'[{"name":"Kate", "surname":"Winston"}, {"name":"Jack", "surname":"Irving"}]'
];
您需要一个小补丁:
...
foreach($ar as $num=>&$subar){
$ar[$num] = json_decode($subar);
foreach($subar as $num2=>$pers){
...
您将获得相同的输出
你应该接受最能回答上一个问题的答案。也就是说,每个元素中的JSON值都不是有效的JSON——所以我的问题是,该数组的值是如何生成的?@vivek_23它已关闭。@Mlacek我希望这确实解决了您以前的问题。@Qirel我从查询中获取值,然后修剪[]。显示这些数组的
var_dump()
。有太多的方法可以作为解决方案应用,每种方法都取决于输入数据类型。Kate Winston
不应该出现在输出中。如果我不修剪括号,我会得到以下结果:[0]=>[{“姓名”:“John”,“姓氏”:“Smith”},{“姓名”:“Kate”,“姓氏”:“Winston”}]请你解释一下,让人们更好地理解你的想法/解决方案好吗?如果有人的全名是Kat
和eWinston
?
Array
(
[0] => stdClass Object
(
[name] => John
[surname] => Smith
)
[1] => stdClass Object
(
[name] => Jack
[surname] => Irving
)
)
$ar = [
'[{"name":"John", "surname":"Smith"}, {"name":"Kate", "surname":"Winston"}]',
'[{"name":"Kate", "surname":"Winston"}, {"name":"Jack", "surname":"Irving"}]'
];
...
foreach($ar as $num=>&$subar){
$ar[$num] = json_decode($subar);
foreach($subar as $num2=>$pers){
...