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 ";
}