1

我正在尝试处理从 API 动态获取的数据。我知道id' 将永远是唯一的,但name' 经常相互匹配,这是一个问题。使用 PHP,我将如何从该数组中删除name与前一个对象的值相同的任何 stdClass 对象?name我确实希望检查从 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
        )
)

谢谢!

4

3 回答 3

10

您可以使用它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;
});

看看这个小提琴

于 2013-08-06T07:40:11.583 回答
2

你可以这样做:

$newArray = array();

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

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

于 2013-08-06T07:34:42.340 回答
-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');
于 2013-08-07T04:18:40.743 回答