in_array()和对象比较

时间:2014-03-08 17:14:22

标签: php arrays object

我想将对象添加到对象数组中,只要它不在数组中(我不想要克隆)。 我的代码不起作用。

$roleCount = 0;
$roles = Array();

foreach ($result as $row) {

    // create a new Role

    $role = new Role();
    $role->setId($row['role_id']);
    $role->setName($row['roleName']);

    // add $role to $roles only if it's different from those that already are inside $roles array

    if (!in_array($role, $roles)) {
        print_r($role); // This is for test purposes
        $roles[$roleCount] = $role;
        $roleCount++;
        echo "new role added ";
    }

我认为in_array松散的比较应该有效,但似乎没有。

我在object comparison page上读到

  

如果两个对象实例具有相同的属性和值,则它们是相同的,并且是同一类的实例。

那么,为什么我的代码不起作用?它不止一次地添加相同的角色,即使它的属性与数组中已有的角色相同。

注意: print_r($role)输出:

Role Object ( [id:Role:private] => 55 [name:Role:private] => user [description:Role:private] => [services:Role:private] => Array ( ) )
Role Object ( [id:Role:private] => 55 [name:Role:private] => user [description:Role:private] => [services:Role:private] => Array ( ) ) 

因此看起来对象属性是相同的。我错了吗?

2 个答案:

答案 0 :(得分:1)

最简单的解决方案:使用角色的ID作为数组的键(ID 唯一,对吗?

$roles = Array();

foreach ($result as $row) {

    // create a new Role

    $role = new Role();
    $role->setId($row['role_id']);
    $role->setName($row['roleName']);

    // add $role to $roles only if it's different from those that already are inside $roles array

    if (!array_key_exists($role->getId(), $roles)) { //Check if ID already exists as an array key.
        $roles[$role->getId()] = $role;
        echo "new role added ";
    }

我假设Role有一个getId()方法,如果没有,$row["role_id"]也会正常工作。

答案 1 :(得分:0)

角色的ID不同,因此不相等。

您可能希望保留一组角色名称,而不是尝试比较对象。

相关问题