【问题标题】:Remove objects with duplicate values in array of stdClass objects删除 stdClass 对象数组中具有重复值的对象
【发布时间】:2013-08-07 16:44:51
【问题描述】:

我正在尝试处理从 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
        )
)

谢谢!

【问题讨论】:

标签: php arrays


【解决方案1】:

您可以使用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

【讨论】:

  • 谢谢,这看起来可能比@mkdotam 的答案更好?当我确定它有效时,我会试一试并将其标记为正确:)
  • 我不会说它在定义上更好,每种方法都有其优点和缺点。
  • 两件事:第一,为什么每个stdClass对象里面都有一个数组?我仍然是一个新手,但我的示例输出只是数组内的普通 stdClass 对象......其次,我应该输出哪个数组? $filtered?因为那没有用,$known$objects 也没有用...而且第 2-4 行有未终止的左括号...
  • 你是对的,我虽然这样初始化了stdClasses,但它没有,我会更新帖子以正确添加stdClasses
【解决方案2】:

你可以这样做:

$newArray = array();

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

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

【讨论】:

    【解决方案3】:

    我自己在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');
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2015-12-14
      • 2021-08-26
      • 2017-12-31
      • 1970-01-01
      • 2020-06-14
      • 2021-11-17
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多