9

在 PHP 程序中,我有一个包含一些自定义对象的数组,我想查找该数组是否包含某个对象。当然我可以使用array_search,但这会检查对象是否是同一个对象,而不是它是否具有相同的变量。所以我希望能够为对象创建自己的比较函数,我可以将它与 array_search 方法(或类似的方法)一起使用。我希望能够做这样的事情:

class foo
{
    public $_a,$_b;
    function __construct($a,$b)
    {
        $this->_a = $a;
        $this->_b = $b;
    }

    function __equals($object)
    {
        return $this->_a == $object->_a;
    }
}
$f1 = new foo(5,4);
$f2 = new foo(4,6);
$f3 = new foo(4,5);

$array = array($f1,$f2);
$idx = array_search($f3,$array); // return 0

这样的事情可能吗?我知道我也可以创建自己的 array_search 方法,该方法使用类中的方法,但我必须使用 2 个不同的搜索函数,一个用于具有自己比较功能的类,一个用于那些没有吨。

4

2 回答 2

8

这是我最近发现的一个巧妙的小技巧:

class Foo {
    public $a;
    public $b;

    public function __toString() {
        return (string)$this->a;
    }

    public function __construct($a, $b) {
         $this->a = $a;
         $this->b = $b;
    }

}

$a = new Foo(1, 'a');
$b = new Foo(2, 'b');
$c = new Foo(3, 'c');
$d = new Foo(2, 'd');
$array = array($a, $b);

$key = array_search($d, $array);         // false

$key = array_search((string)$c, $array); // false
$key = array_search((string)$d, $array); // 1

这也有效:

$is_equal = ((string)$d == $b);          // true

当传递一个字符串$needle时,array_search将尝试将$haystack中包含的对象转换为字符串以比较它们,__toString如果存在则调用魔术方法,在这种情况下返回Foo::$a

于 2011-02-09T16:36:30.957 回答
3

通常不是。您可能会查看 PECL Operators -Extension,但那确实很旧。

于 2011-02-09T16:27:40.180 回答