2011-05-22 17 views
18

संभव डुप्लिकेट संक्षेप द्वारा दो सरणियों विलय करने के लिए:
PHP: How to sum values of the array of the same keyकैसे मर्ज किए गए मूल्यों

मैं एक array_merge() समारोह है कि मूल्यों को प्रतिस्थापित नहीं करता रहा हूँ, लेकिन उन्हें कहते हैं।

echo "<pre>"; 

    $a1 = array(
     "a" => 2 
     ,"b" => 0 
     ,"c" => 5 
    ); 

    $a2 = array(
     "a" => 3 
     ,"b" => 9 
     ,"c" => 7 
     ,"d" => 10 
    ); 

    $a3 = array_merge($a1, $a2); 
    print_r($a3); 

दुख की बात है, यह इस आउटपुट:

उदाहरण के लिए, इस कोड को मैं कोशिश कर रहा हूँ है

Array 
(
    [a] => 3 
    [b] => 9 
    [c] => 7 
    [d] => 10 
) 

मैं तो कोशिश की array_merge के बजाय,, बस दो सरणियों जोड़ने

$a3 = $a1 + $a2; 

लेकिन यह आउटपुट

Array 
(
    [a] => 2 
    [b] => 0 
    [c] => 5 
    [d] => 10 
) 

जो मैं वास्तव में चाहता हूं वह आवश्यकतानुसार कई सरणी पास करने में सक्षम होना है, और फिर उनका योग प्राप्त करना है। तो मेरी उदाहरण में, मैं उत्पादन होना चाहते हैं:

Array 
(
    [a] => 5 
    [b] => 9 
    [c] => 12 
    [d] => 10 
) 

बेशक मैं कई foreach आदि के साथ schlepp और कुछ समारोह का निर्माण कर सकते हैं, लेकिन देख रहा हूँ या एक होशियार, सफाई घोल। किसी भी संकेतक के लिए धन्यवाद!

+2

ऐसा लगता है कि आप किस तरह की चीज लिखना चाहते हैं। मैं इसे किसी भी माध्यम से "schlepping" पर विचार नहीं करता, यह करना एक बिल्कुल अनूठी चीज है जो करना चाहता है। हालांकि मैं गलत साबित हो सकता था, लेकिन मुझे विश्वास नहीं है कि कोई मूल कार्य है जो इसे स्वयं ही संभाल सकता है। यदि कोई फ़ंक्शन लिखना समाधान है, तो क्या आपको अभी भी सहायता चाहिए? –

+0

मेरा मानना ​​है कि कोई अंतर्निहित फ़ंक्शन नहीं है जो यह कर सकता है, इस प्रश्न को जांचें: http://stackoverflow.com/questions/1496682/php-how-to-sum-values-of-the-array-of-the -समैम कुंजी –

+2

प्रश्न गलत बना दिया गया है। 'array_merge' ** ** सभी ** कुंजी * बनाए रखने के दौरान दो सरणी विलय करता है। लेकिन आप * दो सरणी * की समान कुंजी के ** मान ** को जोड़ना चाहते हैं, जो कुछ और है। – deceze

उत्तर

3

इसकी तो की तरह कुछ करने को मुश्किल नहीं:

$a3 = $a1; 

foreach($a2 as $k => $v) { 
    if(array_key_exists($k, $a3)) { 
     $a3[$k] += $v; 
    } else { 
     $a3[$k] = $v; 
    } 
} 
+1

'in_array' यहां गलत चीज़ है, आप 'isset' या' array_key_exists' की तलाश में हैं। – deceze

+1

धन्यवाद, मेरी गलती मैंने इसे तय किया –

9

मेरे योगदान: यह करने के लिए

function array_merge_numeric_values() 
{ 
    $arrays = func_get_args(); 
    $merged = array(); 
    foreach ($arrays as $array) 
    { 
     foreach ($array as $key => $value) 
     { 
      if (! is_numeric($value)) 
      { 
       continue; 
      } 
      if (! isset($merged[$key])) 
      { 
       $merged[$key] = $value; 
      } 
      else 
      { 
       $merged[$key] += $value; 
      } 
     } 
    } 
    return $merged; 
} 

पास के रूप में कई सरणियों के रूप में आप चाहते हैं। कुछ और रक्षा, बहुआयामी सरणी स्वीकार करने की क्षमता, या टाइपिंग जांचने के लिए स्वतंत्र महसूस करें।

डेमो: http://codepad.org/JG6zwAap

41
$sums = array(); 
foreach (array_keys($a1 + $a2) as $key) { 
    $sums[$key] = (isset($a1[$key]) ? $a1[$key] : 0) + (isset($a2[$key]) ? $a2[$key] : 0); 
} 

आप त्रुटि दमन ऑपरेटर का उपयोग निम्नलिखित को यह छोटा सकता है, लेकिन यह बदसूरत विचार किया जाना चाहिए:

$sums = array(); 
foreach (array_keys($a1 + $a2) as $key) { 
    $sums[$key] = @($a1[$key] + $a2[$key]); 
} 

वैकल्पिक रूप से, कुछ मानचित्रण:

$keys = array_fill_keys(array_keys($a1 + $a2), 0); 
$sums = array_map(function ($a1, $a2) { return $a1 + $a2; }, array_merge($keys, $a1), array_merge($keys, $a2)); 

या दोनों समाधान का एक संयोजन की तरह:

$sums = array_fill_keys(array_keys($a1 + $a2), 0); 
array_walk($sums, function (&$value, $key, $arrs) { $value = @($arrs[0][$key] + $arrs[1][$key]); }, array($a1, $a2)); 

मुझे लगता है कि इन पर्याप्त जब भी जरूरत मौके पर ही उनमें से एक अनुकूल करने के लिए, लेकिन एक समारोह के संदर्भ में यह डाल करने के लिए है कि सरणियों के एक असीमित संख्या में स्वीकार करता है संक्षिप्त कर रहे हैं और उन्हें बताता है:

function array_sum_identical_keys() { 
    $arrays = func_get_args(); 
    $keys = array_keys(array_reduce($arrays, function ($keys, $arr) { return $keys + $arr; }, array())); 
    $sums = array(); 

    foreach ($keys as $key) { 
     $sums[$key] = array_reduce($arrays, function ($sum, $arr) use ($key) { return $sum + @$arr[$key]; }); 
    } 
    return $sums; 
} 
+1

अब यह क्यों मतदान किया गया था, कृपया? यह गुप्त दिख सकता है, लेकिन केवल तभी जब आप सेट और फ़ंक्शंस में सोचने के लिए उपयोग नहीं करते हैं। आईएमओ यह नेस्टेड लूप या 'if's' के टन से बहुत अधिक सुरुचिपूर्ण है। – deceze

+7

+1 समाधान की सबसे दिलचस्प रेंज :) –

+1

तीसरा समाधान मेरे लिए सरणी कुंजी रीसेट किया गया। – Volvox

-4

आप array_push फ़ंक्शन का उपयोग कर सकते हैं।मुझे आशा है कि यह आप

foreach($a2 as $a2){ 
    array_push($a1, $a2); 
    } 

    print_r($a1); 

Output: 

Array 
(
    [a] => 2 
    [b] => 0 
    [c] => 5 
    [0] => 3 
    [1] => 9 
    [2] => 7 
    [3] => 10 
) 

में मदद मिलेगी या आप numbers.It साथ महत्वपूर्ण मूल्य में अपने तर्क को बदल सकते हैं काम करता है यहां तक ​​कि यह एक ही नंबर है इस प्रकार है:

<?php 
$beginning = array(1 => 'foo'); 
$end = array(1 => 'bar'); 
$result = array_merge((array)$beginning, (array)$end); 
print_r($result); 
?> 

Output: 

Array (
[0] => foo 
[1] => bar 
) 

का आनंद लें !!!!!! !!!!!!!!

+3

-1 क्या आपने प्रश्न भी पढ़ा था? –

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