Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php in_array()和对象比较_Php_Arrays_Object - Fatal编程技术网

Php in_array()和对象比较

Php in_array()和对象比较,php,arrays,object,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']); // a

我只想将一个对象添加到一个对象数组中,前提是该对象不在数组中(我不想克隆)。 我的代码不起作用

$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
松散比较应该有效,但似乎没有

我在报纸上读到

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

那么,为什么我的代码不起作用呢?它多次添加相同的角色,即使其属性与数组中已存在的角色相同

注意:
打印($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 ( ) ) 

因此,对象属性似乎是相同的。我错了吗?

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


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

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


我假设
Role
有一个
getId()
方法,如果没有,
$row[“Role\u id”]
也可以正常工作。

Role\u id
没有区别,它是相同的(它只是我数据库中一行的一列)。我需要一个对象数组,因为我必须将它传递给
用户
对象:)它工作了:)但是为什么
in_array()?它不是应该检查对象属性是否相等吗?@KurtBourbaki:是的。你可能还有其他不同之处。请注意,两个对象上的所有属性都必须相同。(如中所示,
==
相同)。我编辑了我的问题。两个
$role
对象的属性似乎相同。问题可能是因为属性是私有的吗?我回答自己:在
角色中更改属性可见性没有帮助。我想更好的问题是,为什么在保留角色的任何存储中都有重复的ID?如果您使用的是数据库,ID列上的
主键应该可以解决您的问题。@SecondRikudo我在db上没有重复的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 ";
    }