2011-08-07 16 views
7

मुझे कुछ सरणी को कुछ अलग तरीके से मर्ज करने की आवश्यकता है और मैं array_merge_recursive का उपयोग करता हूं। हालांकि कुछ ऐसा है जो मुझे बदलने की जरूरत है और मुझे नहीं पता कि कैसे। यहाँ php.netphp रिकर्सिव विलय

अगर, हालांकि, सरणियों ही संख्यात्मक कुंजी है, बाद में मूल्य मूल मूल्य ओवरराइट नहीं करेगी से उद्धरण है, लेकिन जुड जाएगा।

मुझे यह मान चाहिए, संलग्न नहीं किया जाना चाहिए, मैं नई सरणी में सटीक मूल्यों को जोड़ना नहीं चाहता हूं। आशा है कि आप इसे समझ चुके हैं।

उदाहरण:

$array = array(
    'some' => array(
     'other' => 'key', 
    ), 
); 

$array2 = array(); 
$array2['some']['other'] = 'key2'; 

अगर मैं array_merge_recursive का उपयोग यह इस परिणाम होगा: अगर यह एक ही परिणाम से मेल खाता है, है.हां मैं जानता हूँ कि संलग्न नहीं

Array (
    [some] => Array 
     (
      [other] => Array 
       (
        [0] => key 
        [1] => key2 
       ) 
     )) 

मैं चाहता हूँ, आप कह सकते हैं कि , फिर array_merge का उपयोग करें, लेकिन यह भी अच्छी तरह से काम नहीं करता है। अगर मैं का उपयोग करें:

$array = array(
    'some' => array(
     'other' => 'key', 
    ), 
); 

$array2 = array(); 
$array2['some']['other2'] = 'key2'; 

print_r(array_merge($array, $array2)); 

यह सूची से $ सरणी [कुछ] [अन्य] को हटाने और केवल $ सरणी [कुछ] [other2] मैं नहीं जानता कि जो बेहतर है, क्योंकि कोई छोड़ देंगे एक बेहतर बनाता है।

+1

कैसे गहरी अपने सरणी में नेस्टिंग है का उपयोग करें? बस एक स्तर? – hakre

+1

तो हमें बताएं कि आपका परिणाम क्या होना चाहिए? – scube

+0

वैसे यह असीमित हो सकता है। मैं इसे केवल 1 स्तर के लिए उपयोग नहीं करूँगा। –

उत्तर

5

कोशिश इस

<?php 
function mymerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion 
    foreach($b as $child=>$value){ 
     if(isset($a[$child])){ 
      if(is_array($a[$child]) && is_array($value)){ //merge if they are both arrays 
       mymerge($a[$child],$value); 
      } 
      //else ignore, you can add your own logic, i.e when 1 of them is array 
     } 
     else 
      $a[$child]=$value; //add if not exists 
    } 

    //return $a; 
} 
1

मैं इसके लिए मेरी मर्ज वर्ग ने लिखा है:

<?php 

class ArrayMerge 
{ 

    /** 
    * @param array $a 
    * @param array $b 
    * 
    * @return array 
    */ 
    public function merge ($a, $b) { 
     foreach ($b as $k => $v) { 
      if (is_array($v)) { 
       if (isset($a[ $k ])) { 
        if ($this->isDeep($v)) { 
         $a[ $k ] = $this->merge($a[ $k ], $v); 
        } else { 
         $a[ $k ] = array_merge($a[ $k ], $v); 
        } 
       } else { 
        $a[ $k ] = $v; 
       } 
      } else { 
       $a[ $k ] = $v; 
      } 
     } 
     return $a; 
    } 

    /** 
    * @param array $array 
    * 
    * @return bool 
    */ 
    private function isDeep ($array) { 
     foreach ($array as $elm) { 
      if (is_array($elm)) { 
       return TRUE; 
      } 
     } 
     return FALSE; 
    } 

} 
1

मैं Riad के संस्करण और कहा कि वस्तु से निपटने से शुरू कर दिया। परीक्षण और प्रतिक्रिया

function recursiveMerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion 
     if(is_array($b) || is_object($b)){ 
      foreach($b as $child=>$value){ 
       if(is_array($a)){ 
        if(isset($a[$child])) 
         recursiveMerge($a[$child],$value); 
        else 
         $a[$child]=$value; 
       } 
       elseif(is_object($a)){ 
        if(isset($a->{$child})) 
         recursiveMerge($a->{$child},$value); 
        else 
         $a->{$child}=$value; 
       } 
      } 
     } 
     else 
      $a=$b; 
    } 
+0

धन्यवाद साथी। :) –

1

एक अन्य वैकल्पिक, array_merge_deep Drupal से की आवश्यकता है:

function array_merge_deep($arrays) { 
    $result = array(); 
    foreach ($arrays as $array) { 
    foreach ($array as $key => $value) { 
     // Renumber integer keys as array_merge_recursive() does. Note that PHP 
     // automatically converts array keys that are integer strings (e.g., '1') 
     // to integers. 
     if (is_integer($key)) { 
     $result[] = $value; 
     } 
     // Recurse when both values are arrays. 
     elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) { 
     $result[$key] = array_merge_deep(array($result[$key], $value)); 
     } 
     // Otherwise, use the latter value, overriding any previous value. 
     else { 
     $result[$key] = $value; 
     } 
    } 
    } 
    return $result; 
} 
संबंधित मुद्दे