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

अच्छा! कॉलबैक फ़ंक्शन को इंगित करने के लिए मैं हमेशा 'सरणी' ('FOS', 'तुलना') 'नोटेशन के बारे में भूल जाता हूं। कोई विचार जहां उस नोटेशन को दस्तावेज किया गया है? मैं कभी-कभी कभी-कभी उदाहरण में इस पर यात्रा करता हूं। – dnagirl

+1

@dnagirl: यहां PHP मैनुअल देखें: http://de.php.net/manual/en/language.pseudo-types.php#language.types.callback –

+0

@Stefan गेहरिग: बहुत धन्यवाद! कभी-कभी चीजों को ढूंढना वाकई मुश्किल होता है जब आप नहीं जानते कि उन्हें क्या कहा जाता है। – dnagirl

संबंधित मुद्दे