替换重复的fom stdclass数组php

时间:2014-08-05 11:47:06

标签: php arrays

当我打印$online_performers变量时,我想获得id 2的唯一值。我是否需要先在标准阵列中转换它们,否则可能没有它? (删除所有重复项。)请检查我的新代码。

 Array
        (
            [0] => stdClass Object
            (
                [id] => 1
                [username] => Sample1
            )
            [1] => stdClass Object
            (
                [id] => 2
                [username] => Sample1
            )
           [2] => stdClass Object
            (
                [id] => 2
                [username] => Sample1
            )
           [3] => stdClass Object
            (
                [id] => 4
                [username] => Sample4
            )
        )



to
    Array
        (
            [0] => stdClass Object
            (
                [id] => 1
                [username] => Sample1
            )
            [1] => stdClass Object
            (
                [id] => 4
                [username] => Sample4
            )
        )

3 个答案:

答案 0 :(得分:2)

为此目的,PHP有一个名为array_filter()的函数:

$filtered = array_filter($array, function($item) {
    static $counts = array();
    if(isset($counts[$item->id])) {
        return false;
    }

    $counts[$item->id] = true;
    return true;
});

请注意static关键字的使用情况。如果在函数内部使用,则意味着在第一次调用函数时,变量将仅被初始化一次。这样就可以在多个函数调用中保留查找表$counts


在你发表的评论中,如果X出现多次,你还会搜索一种删除id为X的项目的方法。您可以使用以下算法,该算法使用查找表$ids来检测id出现多于1的元素并删除它们(全部):

$array = array("put your stdClass objects here");

$ids = array();
$result = array();

foreach($array as $item) {
    if(!isset($ids[$item->id])) {
        $result[$item->id]= $item;
        $ids[$item->id] = true;
    } else {
        if(isset($result[$item->id])) {
            unset($result[$item->id]);
        }
    }
}

$result = array_values($result);
var_dump($result);

答案 1 :(得分:1)

假设我们有:

$array = [
   //items 1,2,3 are same
   (object)['id'=>1, 'username'=>'foo'],
   (object)['id'=>2, 'username'=>'bar'],
   (object)['id'=>2, 'username'=>'baz'],
   (object)['id'=>2, 'username'=>'bar']
];

然后重复取决于你的意思。例如,如果是这样的话:两个具有相同id的项目被视为重复项,那么:

$field = 'id';

$result = array_values(
   array_reduce($array, function($c, $x) use ($field)
   {
      $c[$x->$field] = $x;
      return $c;
   }, [])
);

但是,如果那是关于所有字段(应该匹配),那么这是另一回事:

$array = [
   //1 and 3 are same, 2 and 3 are not:
   (object)['id'=>1, 'username'=>'foo'],
   (object)['id'=>2, 'username'=>'bar'],
   (object)['id'=>2, 'username'=>'baz'],
   (object)['id'=>2, 'username'=>'bar']
];

你需要以某种方式识别你的价值行。最简单的方法是serialize()

$result = array_values(
   array_reduce($array, function($c, $x)
   {
      $c[serialize($x)] = $x;
      return $c;
   }, [])
);

但是这可能会很慢,因为你会序列化整个对象结构(所以你不会看到对小对象的性能影响,但是对于复杂的结构和大量的对象,这听起来很糟糕)

此外,如果您不关心结果数组中的键,则可以省略array_values()调用,因为它仅用于使键连续数字。

答案 2 :(得分:1)

如果您不关心更改keys,可以通过简单的循环来完成此操作:

$aUniq = array ();
foreach($array as $obj) {
    $aUniq[$obj->id] = $obj;
}

print_r($aUniq);