2011-12-05 23 views
5

गठबंधन करता है मैं दो बहु-आयामी सरणी को गठबंधन करने के लिए array_combine का उपयोग करने का प्रयास कर रहा हूं, लेकिन किसी भी तरह से इसे सही तरीके से नहीं कर रहा हूं।PHP दो बहु-आयामी सरणी

यहाँ array1 है:

Array(
    [Nov 18, 2011] => Array(
     [C] => 107705.5792 
     [I] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [C] => -8992.8352 
    ) 
) 

और यहाँ array2 है:

$array1 = ($arr1); 
$array2 = ($arr2); 
$result = array_combine($arr1, $arr2); 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

मैं क्या कर रहा हूँ:

Array(
    [Nov 18, 2011] => Array(
     [C] => 3 
     [I] => 1 
    ) 
    [Nov 22, 2011] => Array(
     [C] => 2 
    ) 
) 

यहाँ array_combine पर मेरे प्रयास है, जो काम नहीं कर रहा है गलत? यह परिणाम है कि मैं देख रहा हूं:

Array(
    [Nov 18, 2011] => Array(
     [3] => 107705.5792 
     [1] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [2] => -8992.8352 
    ) 
) 

आपकी सहायता के लिए धन्यवाद।

  • संपादित करें -

मैं ने पाया है कि अगर मैं बजाय array_merge_recursive उपयोग करते हैं, यह मेरा नतीजा यह है कि मैं हो रही है। नहीं हैं कि क्या मैं खोज रहा था, लेकिन करीब:

Array(
    [Nov 18, 2011] => Array(
     [C] => Array(
      [0] => 3 
      [1] => 107705.5792 
     ) 
     [I] => Array(
      [0] => 1 
      [1] => 44561.52 
     ) 
    ) 
    [Nov 22, 2011] => Array(
     [C] => Array(
      [0] => 2 
      [1] => -8992.8352 
     ) 
    ) 
) 
  • को और संपादित -

यहाँ जिस तरह से है कि मैं नीचे दिए गए सुझावों में से एक को लागू करने की कोशिश की है, लेकिन इस के लिए काम नहीं कर रहा है मुझे। क्या गलत है ?:

function cust_array_merge(array &$array1, array $array2){ 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal;}}}}} 

$merged = cust_array_merge($arr_cats_per_bill_date, $arr_cvat); 
echo '<pre>'; 
    print_r($merged); 
echo '</pre>'; 
+0

क्या आप मुख्य संदर्भ रखना चाहते हैं या आपको 0 1 2 होने पर परवाह नहीं है? आपके पास "सी" या "मैं" या आपकी सरणी में कोई अन्य मान नहीं हो सकता है। – phpmeh

+0

सचमुच ** आपके ** प्रश्नों में से सभी का सटीक वही सामग्री और सरणी क्यों हैं? क्या हम आपका होमवर्क या स्कूल के लिए कुछ कर रहे हैं? यह सचमुच _third_ या _fourth_ प्रश्न है जिसे मैंने पिछले हफ्ते या दो में देखा है जो लगभग पिछले जैसा ही है .. –

+0

@phpmeh, नहीं, मैं मुख्य संदर्भ नहीं रखना चाहता हूं। – DanielAttard

उत्तर

3

array_merge_recursive हो जाता है आप बहुत करीब (अपने "कुंजी" पत्ती सरणियों के सूचकांक 1 में है, और अपने मूल्य सूचकांक 0 में है)। तो इसे दो चरणों में करें: पहले मर्ज किए गए सरणी को प्राप्त करें, फिर शाखाओं के साथ इसे सही करने के लिए बेवकूफ बनें।

// This is a callback for array_map() which should have some more generic uses. 
// array(array('k', 'v'), ...) -> array('k' => 'v', ...) 
function flatten_branches($branches) { 
    $newleaves = array(); 
    foreach ($branches as $leaf) { 
     $newleaves[$leaf[0]] = $leaf[1]; 
    } 
    return $newleaves; 
} 

function merge_flatten_branches($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches', $m1); 
} 

$merged = merge_flatten_branches($array2, $array1); 
print_r($merged); 

बस मस्ती के लिए, यहां दो और दृष्टिकोण हैं। ये दोनों merge_flatten_branches से थोड़ा धीमे हैं, लेकिन कुछ उपयोगी सरणी अवधारणाओं को चित्रित करते हैं। (Php की तुलना में अन्य अधिक कार्यात्मक-स्वाद वाली भाषाओं में, इन्हें प्राथमिकता दी जा सकती है।)

function merge_flatten_branches_reduce($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_reduce', $m1); 
} 

function merge_flatten_branches_add($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_add', $m1); 
} 

// The functions below are callbacks for the two above. 

function array_add($a1, $a2) { 
    return $a1+$a2; 
} 

function flatten_leaf($leaf) { 
    return array($leaf[0] => $leaf[1]); 
} 

function flatten_branches_add($branches) { 
    $leaves = array_map('flatten_leaf', ($branches)); 
    $finalleaves = array(); 
    foreach ($leaves as $leaf) { 
     $finalleaves += $leaf; 
    } 
    return $finalleaves; 
} 


function flatten_branches_reduce($branches) { 
    $l = array_map('flatten_leaf', ($branches)); 
    return array_reduce($l, 'array_add', array()); 
} 
+0

यह बहुत अच्छा फ्रांसिस है। आपके समाधान स्पॉट-ऑन थे। वास्तव में परिणाम मैं देख रहा था। अब मुझे अपने सिर को लपेटने की जरूरत है कि यह कैसे किया गया था। बहुत धन्यवाद। – DanielAttard

+0

अपने सिर को लपेटें _how यह किया गया था _? मैं, दूसरी तरफ, यह समझने की कोशिश कर रहा हूं कि बिल्ली किस प्रकार शब्दावली का मतलब है। वह सब 'flatten_leaf' सामान बल्कि गूढ़ है। क्रिप्टिक फ़ंक्शन नाम ... अच्छा नहीं। यदि यह एक चालाक, अभी तक अर्थहीन, फ़ंक्शन नाम प्रतियोगिता था, तो 'merge_flatten_branches_reduce' उड़ने वाले रंगों के साथ जीत जाएगा। फिर भी, एक कामकाजी समाधान के लिए +1। –

1

परिणाम जो आप खोज रहे हैं वह वास्तव में मेरे लिए कस्टम दिखता है। ऐसा कहने के लिए, मुझे किसी अंतर्निहित PHP सरणी फ़ंक्शंस के बारे में पता नहीं है जो करेगा। हालांकि, मैंने आपके लिए एक कस्टम फ़ंक्शन लिखा था। चेतावनी: यह इस अवसर के लिए बहुत ही अनुकूल है और इस प्रकार शायद पुन: प्रयोज्य नहीं है।

function cust_array_merge(array $array1, array $array2) 
{ 
    $merged = array(); 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal; 
       } 
      } 
      $merged = $array1; 
     } 
    } 
    return $merged; 
} 
+0

उत्तर के लिए धन्यवाद, लेकिन मुझे इसे लागू करने में परेशानी हो रही है। मैंने आपके प्रश्न को संपादित करने के लिए संपादित किया है जो मैंने अभी तक किया है। क्या आप देख सकते हैं कि मैंने क्या गलत किया है? – DanielAttard

+0

'cust_array_merge' फ़ंक्शन वास्तव में कुछ भी वापस नहीं करता है। पहला तर्क यह स्वीकार करता है ('$ array1') _reference_ (इसलिए' & ') है। –

+0

मैंने इसे बदल दिया ताकि यह अब मर्ज किए गए सरणी को वापस कर दे। मेरा संपादित फ़ंक्शन देखें और यह आपके लिए काम करना चाहिए। –

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