2010-02-06 11 views
10

वहाँ रिकर्सिवली सरणियों विलय, पीएचपी के array_merge_recursive() समारोह के रूप में एक ही तरीके से करता है, सिवाय इसके कि पूर्णांक कुंजी स्ट्रिंग कुंजी के रूप में एक ही इलाज कर रहे हैं के लिए एक दृष्टिकोण है?PHP के पूर्णांक कुंजी पर array_merge_recursive व्यवहार

(यह प्रक्रिया है कि कुंजी पार्स करने योग्य पूर्णांक के रूप में रहने के लिए जरूरी है।)

उदाहरण के लिए:

$a = array(
    'a' => array(1) 
); 
$b = array(
    'a' => array(2, 3) 
); 
var_dump(array_merge_recursive($a, $b)); 

"a" कुंजी और उत्पादन पर विलय होगा, उम्मीद के रूप में, निम्नलिखित:

array(1) { 
    ["a"] => array(3) { 
     [0] => int(1) 
     [1] => int(2) 
     [2] => int(3) 
    } 
} 

हालांकि, जब कुंजी (तब भी जब एक स्ट्रिंग के रूप में) के लिए पूर्णांकों का उपयोग कर:

$a = array(
    '123' => array(1) 
); 
$b = array(
    '123' => array(2, 3) 
); 
var_dump(array_merge_recursive($a, $b)); 

array_merge_recursive() वापस आ जाएगी:

array(2) { 
    [0] => array(3) { 
     [0] => int(1) 
    } 
    [1] => array(2) { 
     [0] => int(2) 
     [1] => int(3) 
    } 
} 
ज्यादा वांछित के बजाय

:

array(1) { 
    ["123"] => array(3) { 
     [0] => int(1) 
     [1] => int(2) 
     [2] => int(3) 
    } 
} 

विचार?

उत्तर

2

आप एक छोटी तार के साथ सरणी कुंजी उपसर्ग कर सकते हैं:

function addPrefix($a) { 
    return '_' . $a; 
} 
# transform keys 
$array1 = array_combine(array_map('addPrefix', array_keys($array1)), $array1); 
$array2 = array_combine(array_map('addPrefix', array_keys($array2)), $array2); 
# call array_combine 
$array = array_merge_recursive($array1, $array2); 
# reverse previous operation 
function stripPrefix($a) { 
    return substr($a, 1); 
} 
$array = array_combine(array_map('stripPrefix', array_keys($array)), $array)  
+1

हालांकि यह सही है, यह बहुत प्रतिस्पर्धा महसूस करता है। इसके बजाए नियमित लूप क्यों नहीं? – Ezequiel

3

मैं एक स्ट्रिंग जोड़कर कुंजी परिवर्तित करने की soulmerge के विचार का उपयोग कर रहा हूँ। मेरा नया फ़ंक्शन केवल 2 मानकों को संभाल सकता है, लेकिन यह आपके मामले में था, इसलिए मैं यही गया। एक नज़र देख लो।

// Adds a _ to top level keys of an array 
function prefixer($array) { 
    $out = array(); 
    foreach($array as $k => $v) { 
     $out['_' . $k] = $v; 
    } 
    return $out; 
} 
// Remove first character from all keys of an array 
function unprefixer($array) { 
    $out = array(); 
    foreach($array as $k => $v) { 
     $newkey = substr($k,1); 
     $out[$newkey] = $v; 
    } 
    return $out; 
} 
// Combine 2 arrays and preserve the keys 
function array_merge_recursive_improved($a, $b) { 
    $a = prefixer($a); 
    $b = prefixer($b); 
    $out = unprefixer(array_merge_recursive($a, $b)); 
    return $out; 
} 

और नमूना डेटा की तरह क्या बाहर है लग रहा है?

// some sample data  
$a = array(
    '123' => array(1) 
); 
$b = array(
    '123' => array(2, 3) 
); 

// what do the results say:  
print_r($a); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 1 
//  ) 
// 
//) 

print_r($b); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 2 
//    [1] => 3 
//  ) 
// 
//) 

और उन्हें बाहर की कोशिश करते हैं: बजाय इसे संख्या के साथ भरने के लिए

print_r(array_merge_recursive($a, $b)); 
// Array 
// (
//  [0] => Array 
//   (
//    [0] => 1 
//  ) 
// 
//  [1] => Array 
//   (
//    [0] => 2 
//    [1] => 3 
//  ) 
// 
//) 

print_r(array_merge_recursive_improved($a, $b)); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 1 
//    [1] => 2 
//    [2] => 3 
//  ) 
// 
//) 
+1

आपका 'prefixer' और' unprefixer' कार्यों अगर मूल्य एक सरणी है सत्यापित करने के लिए की जरूरत है! उदाहरण के लिए, 'उपसर्ग' में, आपको 'if (is_array ($ v)) \t \t { \t \t \t $ बाहर [' _ 'होना चाहिए। $ के] = उपसर्ग ($ v); \t \t} \t बाकी \t \t { \t \t \t \t बाहर $ [ '_'।$ के] = $ वी; \t \t} 'लूप के अंदर। अन्यथा यह बहुत अच्छा काम कर रहा है! – Link14

0

आप चाहते हैं कुंजी स्ट्रिंग के रूप में इलाज किया जाना है, तो बस यह एक उपसर्ग जोड़ने जब आप इसे भरने के तार बनाने के लिए, और फिर इसे ऑर्डर करने के लिए बस एक और सरणी फिर से भरें।

0

यह पुनरावर्ती सरणी मर्ज समारोह पूर्णांक कुंजी फिर से अंकित करना और मौजूदा अभियानों में नए मूल्यों संलग्न कर देता है या अगर जोड़ी मौजूद नहीं है एक नया [कुंजी => मूल्य] जोड़ी कहते हैं नहीं करता है। मुझे लगता है और यकीन है कि यह कार्य है कि आपको क्या चाहिए।

function array_merge_recursive_adv(array &$array1, $array2) { 
     if(!empty($array2) && is_array($array2)) 
      foreach ($array2 as $key => $value) { 
        if(array_key_exists($key,$array1)) { 
         if(is_array($value)){ 
          array_merge_recursive_adv($array1[$key], $value); 
         } else { 
          if(!empty($array1[$key])) { 
           if(is_array($array1[$key])){ 
            array_push($array1[$key], $value); 
           } else { 
            $array1[$key] = [$array1[$key]]; 
            $array1[$key][] = $value; 
           } 
          } else if(empty($array1[$key])) { 
           $array1[$key] = $value; 
          } 
         } 
        } else { 
         $array1[$key] = $value; 
        } 
      } 
      return $array1; 
    } 
संबंधित मुद्दे