比较两个对象 PHP

4

我需要比较两个对象以去除重复项/查找新条目。

这两个对象不完全相同,但它们包含相同的用户名键。

以下是布局:

数据库对象

array
  [0]db->username
  [0]db->something
  [1]db->username
  [1]db->something
  etc

其他对象

array
  [0]ob->username
  [0]ob->somethingElse
  [1]ob->username
  [1]ob->somethingElse
  etc

我想循环一个对象数组,将$db[$key]->username与另一个对象$ob[$key]->username的内部循环进行比较,但是否有更简洁的方法?

我希望删除重复项。


1
如果有帮助的话,您也可以直接使用 SQL 在数据库上进行去重。 - Popnoodles
1个回答

3

不,没有更简洁的方法,你必须循环遍历属性。如果它们不是StdClass对象,我会在它们的类中添加自定义比较方法:

class Person {

   protected $id;
   protected $name;
   protected $age;

   /**
    * Compares two persons an returns true if their name
    * and age equals.
    */
   public function equals(Person $b) {
       if($b->name === $this->name && $b->age === $this->age) {
           return TRUE;
       }
       return FALSE;
   }
}

然后像这样使用它:
$personA = DB::getPersonById(1);
$personB = DB::getPersonById(2);

if($personA->equals($personB)) {
    echo "They are equal";
}

除此之外,为什么不直接使用SQL删除重复项或者更好的方法是在数据库中使用唯一键来避免重复?


如果对象是相同的,我能直接使用“==”吗? - user2559108
1
实际上,在 php 5 中,== 运算符可以用于对象。当且仅当 typeof A === typeof B 且 A 具有与 B 相同的属性时,A == B 成立。 - Sam Dufel
1
@hek2mgl - 什么?它正是我说的那样工作。 如果你运行new A(1) == new A(1),你会得到true,否则为false。请参见http://www.php.net/manual/en/language.oop5.object-comparison.php。 - Sam Dufel
@SamDufel 噢,我错过了回复你的评论。是的,你说的是对的,但在这个问题中,对象没有相同的属性,只需要删除重复的用户名。(我猜当从数据库检索对象时,id 在大多数情况下会有所不同) - hek2mgl
1
那个评论是针对@IvanRistic的如果对象是相同的,我可以只使用==吗 - 答案是可以。 - Sam Dufel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接