当我打印$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
)
)
答案 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);