2010-12-03 97 views
5

我正在寻找比较PHP中对象数组的简洁方式。我知道我可以检查相等大小的数组,然后通过一个数组循环查找第二个数组中的每个对象,但我认为使用一个或多个数组比较函数会更好。比较对象数组

我测试对象和我来对抗的主要问题的几个阵列是该阵列的比较函数坚持比较元件如strings,像这样:

class Foo{ 
    public $pk=NULL; 
    function __construct($pk){ 
     $this->pk=$pk; 
    } 

    function __toString(){ 
     return (string)$this->pk;//even an integer must be cast or array_intersect fails 
    } 
} 

for($i=1;$i<7;$i++){ 
    $arr1[]=new Foo($i); 
} 
for($i=2;$i<5;$i++){ 
    $arr2[]=new Foo($i); 
} 

$int=array_intersect($arr1,$arr2); 
print_r($int); 

输出

Array 
(
[1] => Foo Object 
    (
     [pk] => 2 
    ) 

[2] => Foo Object 
    (
     [pk] => 3 
    ) 

[3] => Foo Object 
    (
     [pk] => 4 
    ) 

那很好,如果对象有__toString()方法如果这些__toString()方法返回一个唯一的标识符,从不''

但如果不是这种情况会发生什么,说像这样的对象:

class Bar{ 
    public $pk=NULL; 
    function __construct($pk){ 
     $this->pk=$pk; 
    } 

    function __toString(){ 
     return 'I like candy.';//same for all instances 
    } 

    function Equals(self $other){ 
     return ($this->pk==$other->pk); 
    } 

} 

是否有可能做array_uintersect($arr1,$arr2,$somecallback)是强制使用的Foo::Equals()?从我所看到的转换到string发生在调用回调之前。

任何想法如何解决这个问题?

回答

7

是的,你可以使用array_uintersect这个。

一些示例代码:

class Fos { 
    public $a = 0; 
    function __construct($a) { 
     $this->a = $a; 
    } 
    static function compare($a, $b) { 
     if ($a->a == $b->a) return 0; 
     if ($a->a > $b->a) return 1; 
     if ($a->a < $b->a) return -1; 
    } 
} 

$fos1 = array(); 
$fos2 = array(); 

for ($i = 1; $i < 10; $i++) { 
    $fos1[] = new Fos($i); 
} 

for ($i = 8; $i < 18; $i++) { 
    $fos2[] = new Fos($i); 
} 

$fosi = array_uintersect($fos1, $fos2, array('Fos','compare')); 
+0

不错!我总是忘记`array('Fos','compare')`表示回调函数属于一个类的符号。任何想法记录该符号的想法?偶尔的例子中,我只是经历过它。 – dnagirl 2010-12-03 16:33:09