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つの異なる検索関数を使用する必要があります。1つは独自の比較関数を持つクラス用で、もう1つはないクラス用です。 t。

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が渡されると、 $ haystackarray_searchに含まれるオブジェクトを文字列にキャストして、それらを比較しようとします。マジックメソッドが存在する場合はそれを呼び出します。この場合は。を返します。__toStringFoo::$a

于 2011-02-09T16:36:30.957 に答える
3

通常はそうではありません。PECL Operators -Extensionを見るかもしれませんが、それは本当に古いものです。

于 2011-02-09T16:27:40.180 に答える