删除stdClass对象数组中具有重复值的对象

时间:2013-08-06 07:28:48

标签: php arrays

我正在尝试处理这些我从API动态获取的数据。我知道id将始终是唯一的,但name经常相互匹配,这是一个问题。使用PHP,我如何删除name与此数组中前一个对象的name值相同的任何stdClass对象?我特别希望检查从0进展到最高值,因为这些stdClass对象中还有其他数据。在这种情况下,我希望删除1,因为其名称与0的名称相匹配,但之后当前2的内容应成为新的1,原因很明显

Array
(
    [0] => stdClass Object
        (
            [id] => 6969
            [name] => Steve Jobs
        )
    [1] => stdClass Object
        (
            [id] => 2013
            [name] => Steve Jobs
        )
    [2] => stdClass Object
        (
            [id] => 1234
            [name] => The Woz
        )
)

谢谢!

3 个答案:

答案 0 :(得分:8)

您可以使用array_filter执行此操作:

$objects = array(
    (object)array('id' => 1, 'name' => 'test1'),
    (object)array('id' => 2, 'name' => 'test2'),
    (object)array('id' => 3, 'name' => 'test1'),
);
$known = array();
$filtered = array_filter($objects, function ($val) use (&$known) {
    $unique = !in_array($val->name, $known);
    $known[] = $val->name;
    return $unique;
});

结帐this fiddle

答案 1 :(得分:2)

您可以这样做:

$newArray = array();

foreach ($array as $value) { $newArray[$value->name] = $value; }

在该周期结束时,您将拥有一个数组,其中每个名称只会遇到一次(并且您将保留该名称的最新出现次数)。

答案 2 :(得分:-1)

我自己在http://seanmonstar.com/post/707138900/making-objects-in-an-array-unique

找到了解决方案

将此功能放在顶部:

function unique_obj($obj) {
    static $idList = array();
    if(in_array($obj->id,$idList)) {
        return false;
    }
    $idList []= $obj->id;
    return true;
}

就在打印/回显数组之前:

$amazingPeople = array_filter($amazingPeople,'unique_obj');