在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个不同的搜索函数,一个用于具有自己的比较函数的类,另一个用于具有自己的比较函数的类。吨。
答案 0 :(得分: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 中包含的对象强制转换为字符串,以便通过调用{{ 1}}魔术方法(如果存在),在这种情况下返回__toString
。
答案 1 :(得分:3)
通常不是。您可以查看PECL Operators - 扩展,但那确实很旧。