2010-12-03 124 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