2011-05-06 21 views
12
में शो diff तुलना

मैं एक तरह से के लिए खोज कर रहा हूँ मुझे दिया वस्तुओं से अलग गुण/मान दिखाने के लिए ...वस्तु गुण और PHP

$obj1 = new StdClass; $obj1->prop = 1; 
$obj2 = new StdClass; $obj2->prop = 2; 

var_dump(array_diff((array)$obj1, (array)$obj2)); 
//output array(1) { ["prop"]=> int(1) } 

यह काम करता है बहुत अच्छी तरह से लंबे समय के रूप संपत्ति एक नहीं है वस्तु या सरणी।

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 

var_dump(array_diff((array)$obj1, (array)$obj2)) 
// Output array(0) { } 
// Expected output - array { ["prop"]=> array { [1]=> int(2) } } 

वहाँ एक रास्ता इस से छुटकारा पाने के है, तब भी जब संपत्ति किसी अन्य वस्तु है?!

+0

आमतौर पर आप कक्षा में एक विधि के साथ इस संभाल, एक 'बराबर ($ वस्तु)' विधि की तरह। शायद आप कक्षा को संशोधित नहीं कर सकते? –

+1

ओह, और वस्तुओं वाले गुणों की तुलना करते समय, आप कैसे मानते हैं कि ऑब्जेक्ट बराबर हैं? यह एक पुनरावर्ती प्रश्न है ... आप जांच सकते हैं कि उनकी गुण बराबर हैं (रिकर्सिव समस्या ...) या यदि वे एक ही उदाहरण हैं (समानता से मजबूत)। –

+1

आपके द्वारा परीक्षण किए जा रहे सटीक कोड के ऊपर कोड है? यदि हां, तो $ obj1 और $ obj2 के प्रोप एक ही सरणी (1,2) हैं। तकनीकी रूप से वास्तव में कोई फर्क नहीं पड़ता है। – dragonjet

उत्तर

4

कुछ निम्नलिखित, जिसके माध्यम से iterates और पुनरावर्ती diff की तरह सरणी में स्वयं आइटम है एक सरणी काम कर सकता है: array_diff को

देस समान काम, लेकिन यह अगर यह होता है देखने के लिए एक जांच करता है एक सरणी पहले (is_array) और यदि ऐसा है, तो उस सरणी के लिए diff को उस सरणी के लिए diff सेट करें। दोहराव दोहराता है।

function recursive_array_diff($a1, $a2) { 
    $r = array(); 
    foreach ($a1 as $k => $v) { 
     if (array_key_exists($k, $a2)) { 
      if (is_array($v)) { 
       $rad = recursive_array_diff($v, $a2[$k]); 
       if (count($rad)) { $r[$k] = $rad; } 
      } else { 
       if ($v != $a2[$k]) { 
        $r[$k] = $v; 
       } 
      } 
     } else { 
      $r[$k] = $v; 
     } 
    } 
    return $r; 
} 

यह तो इस तरह काम करता है:

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 
print_r(recursive_array_diff((array)$obj1, (array)$obj2)); 

/* Output: 
    Array 
    (
     [prop] => Array 
      (
       [1] => 2 
      ) 
    ) 
*/ 
+0

यह लगभग है जो मैं नहीं चाहता , यह काम नहीं करता है अगर $ obj-> prop एक संपत्ति के रूप में सरणी के साथ एक और वस्तु है .. लेकिन मैं इसे सबसे अच्छा जवाब के रूप में रखूंगा .. – nfo

+0

उस स्थिति में आप अपने लूप में कुछ जोड़ सकते हैं जो यह देखने के लिए जांचता है कि ऑब्जेक्ट है या नहीं एक सरणी नहीं, चाहे आप इसे एक के रूप में डालें और उस पर recursive_array_diff चलाएं। –

+0

कुछ ऐसा है (is_array ($ v)) {...} elseif (is_array ((array) $ v) {...} else {...} आपको तत्वों की संख्या की जांच करने की आवश्यकता हो सकती है जांचने के लिए सरणी डालें कि आप गलती से मूल्यों कास्टिंग नहीं कर रहे हैं। अगर आप कुछ काम करते हैं तो मुझे बताएं :) –

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