Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从json数组中删除重复值_Php_Arrays_Json - Fatal编程技术网

在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){
...