মাল্টি-ডাইমেনশনাল অ্যারেতে সমস্ত কলাম মানগুলি কীভাবে যোগ করবেন?


116

এসোসিয়েটিভ কী দ্বারা কীভাবে আমি সমস্ত কলামার মান যুক্ত করতে পারি? লক্ষ্য করুন যে কী সেটগুলি গতিশীল।

ইনপুট অ্যারে:

Array
(
    [0] => Array
        (
            [gozhi] => 2
            [uzorong] => 1
            [ngangla] => 4
            [langthel] => 5
        )

    [1] => Array
        (
            [gozhi] => 5
            [uzorong] => 0
            [ngangla] => 3
            [langthel] => 2
        )

    [2] => Array
        (
            [gozhi] => 3
            [uzorong] => 0
            [ngangla] => 1
            [langthel] => 3
        )
)

কাঙ্ক্ষিত ফলাফল:

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

একটি সাধারণ পরিস্থিতির জন্য, দুটি বহুমাত্রিক অ্যারেগুলির ঠিক একই কী নেই। একত্রীকরণ / মাল্টি
ডাইমেনশনাল

উত্তর:


92
$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    $sumArray[$id]+=$value;
  }
}

print_r($sumArray);

49
কীগুলি এখনও বিদ্যমান না হওয়ায় এটি প্রথম পুনরাবৃত্তির জন্য বিজ্ঞপ্তি নিক্ষেপ করবে।
গম্বো

যদি এন অ্যারে থাকে?
মুহাম্মদ উসমান

2
@ রানামুহাম্মদউসমান: nঅ্যারে থাকলে এই সমাধানটি ব্যবহার করুন ।
অমল মুরালি

2
আমাকে শোনায় সুন্দরতম array_reduce stackoverflow.com/questions/14195916/...
Bill'o

13
বিজ্ঞপ্তিগুলি এড়াতে আপনি লাইনটি assign যোগআররে: array_key_exists ($ id, $ sumArray) এ নির্ধারিত প্রতিস্থাপন করতে পারেন? $ sumArray [$ id] + = $ মান: $ sumArray [$ id] = $ মান;
ডেভ ওব্রায়ান

185

আপনি ব্যবহার করতে পারেন array_walk_recursive()আপনার সমস্যার জন্য একটি সাধারণ-কেস সমাধান (পেতে এক যখন প্রতিটি ভেতরের অ্যারের সম্ভবত অনন্য কী থাকতে পারে )।

$final = array();

array_walk_recursive($input, function($item, $key) use (&$final){
    $final[$key] = isset($final[$key]) ?  $item + $final[$key] : $item;
});

array_walk_recursive()সাধারণ ক্ষেত্রে উদাহরণস্বরূপ

এছাড়াও, যেহেতু পিএইচপি 5.5 আপনি ব্যবহার করতে পারেন array_column()ফলাফলের আপনি চান অর্জনে ফাংশন সঠিক কী-এর জন্য , [gozhi], উদাহরণস্বরূপ:

array_sum(array_column($input, 'gozhi')); 

array_column()নির্দিষ্ট কী জন্য উদাহরণ

যদি আপনি একই কীগুলির সাথে সমস্ত অভ্যন্তরীণ অ্যারের মোট যোগফল পেতে চান ( আপনি যে পছন্দসই ফলাফল পোস্ট করেছেন ) তবে আপনি এটির মতো কিছু করতে পারেন ( মনে রাখবেন যে প্রথম অভ্যন্তরীণ অ্যারেতে অবশ্যই অন্যের মতো কাঠামো থাকতে হবে) ):

$final = array_shift($input);

foreach ($final as $key => &$value){
   $value += array_sum(array_column($input, $key));
}    

unset($value);

array_column()সমস্ত অভ্যন্তরীণ অ্যারেগুলির ক্ষেত্রে একই কী রয়েছে উদাহরণ সহ

আপনি যদি জেনারেল কেস সমাধানটি ব্যবহার করতে চান array_column()তবে প্রথমে আপনি সমস্ত অনন্য কীগুলি বিবেচনা করতে পারেন এবং তারপরে প্রতিটি কীটির যোগফল পেতে পারেন:

$final = array();

foreach($input as $value)
    $final = array_merge($final, $value);

foreach($final as $key => &$value)
    $value = array_sum(array_column($input, $key));

unset($value);

array_column()সাধারণ ক্ষেত্রে উদাহরণস্বরূপ


31

এই স্নিপেট ব্যবহার করুন:

$key = 'gozhi';
$sum = array_sum(array_column($array,$key));

আমি এই প্রশ্নটি ওপি'র পছন্দসই আউটপুট সরবরাহের ক্ষেত্রে কিছুটা কুক্কুট করা হয়েছে তা স্পষ্ট করতে সম্পাদনা করেছি। এটি বলেছে, আপনি যদি নিজের উত্তরটি প্রসারিত করেন তবে এটি সম্ভবত পূর্ববর্তী উত্তরগুলির সদৃশ হয়ে যাবে।
মিকম্যাকুসা

28

এখানে দু'জনের মতোই একটি সমাধান দেওয়া হয়েছে:

$acc = array_shift($arr);
foreach ($arr as $val) {
    foreach ($val as $key => $val) {
        $acc[$key] += $val;
    }
}

তবে এটির অ্যারে কীগুলি ইতিমধ্যে উপস্থিত রয়েছে কিনা এবং তা বিজ্ঞপ্তিও দেয় না তা খতিয়ে দেখার দরকার নেই doesn't


এই নির্দিষ্ট অ্যারে কাঠামোর জন্য খুব চতুর সমাধান +1। খুব খারাপ এটি চূড়ান্ত ফলাফলের মতো কাঠামোগত অ্যারেগুলির আরও সাধারণ ক্ষেত্রে কাজ করে না।
টড চাফি

22

এটি ব্যবহার করেও করা যেতে পারে array_map:

$rArray = array(
    0 => array(
        'gozhi' => 2,
        'uzorong' => 1,
        'ngangla' => 4,
        'langthel' => 5
    ),
    1 => array(
        'gozhi' => 5,
        'uzorong' => 0,
        'ngangla' => 3,
        'langthel' => 2
    ),
    2 => array(
        'gozhi' => 3,
        'uzorong' => 0,
        'ngangla' => 1,
        'langthel' => 3
    ),
);

$sumResult = call_user_func_array('array_map', array_merge(['sum'], $rArray));

function sum()
{
    return array_sum(func_get_args());
}

1
অ্যারের সংখ্যার জন্য উপযুক্ত
দুশায়ন্ত জোশী

1
এন অ্যারের সংখ্যার জন্য আপনি কীভাবে এটি পরিবর্তন করবেন?
প্যাথ্রোস

12
$newarr=array();
foreach($arrs as $value)
{
  foreach($value as $key=>$secondValue)
   {
       if(!isset($newarr[$key]))
        {
           $newarr[$key]=0;
        }
       $newarr[$key]+=$secondValue;
   }
}

3
নোট করুন যে যখনই আপনার অ্যাসাইনমেন্টের ডান পাশে assign newarr [$ key] অ্যাক্সেস করেন তখন এটি আপনাকে পিএইচপি বিজ্ঞপ্তিগুলি (অপরিজ্ঞাত সূচক) দেবে when
এন্টি বীরনা

আমি মনে করি যে আমি $ newarr [] কী]
গ্রাভিটন

4
আপনি কাউকে ভোট দিলে দয়া করে মন্তব্যগুলি ছেড়ে দিন ... যদি আপনি মন্তব্য না করেন তবে সমাধানের উন্নতির কোনও উপায় নেই।
টড চাফি

@ গ্রাভিটন আমি নীচে নামি নি, তবে আমি উল্লেখ করব যে প্রতিটি স্ট্যাকওভারফ্লো উত্তরে সমাধান কীভাবে কাজ করে এবং / বা কেন এটি পরামর্শ দেওয়া হয় সে সম্পর্কে কিছুটা ব্যাখ্যা অন্তর্ভুক্ত করা উচিত। মনে রাখবেন এই সাইট / নেটওয়ার্কের প্রতিটি পৃষ্ঠা হ'ল হাজার হাজার বিকাশকারী / দক্ষতার বিস্তৃত হাজার হাজার বিকাশকারীদের জন্য একটি শিক্ষামূলক সংস্থান। (আমি যদি প্রতিবারই কেবল একটি কোড-উত্তর পেয়েছি তবে আমি যদি কম অনুমান করি তবে আমি রেপ পয়েন্টগুলি শেষ করে দিতাম)
মিকম্যাকুসা

5

নীচে কিছু সুবিধা সহ আরও একটি সংস্করণ।

$sum = ArrayHelper::copyKeys($arr[0]);

foreach ($arr as $item) {
    ArrayHelper::addArrays($sum, $item);
}


class ArrayHelper {

    public function addArrays(Array &$to, Array $from) {
        foreach ($from as $key=>$value) {
            $to[$key] += $value;
        }
    }

    public function copyKeys(Array $from, $init=0) {
        return array_fill_keys(array_keys($from), $init);
    }

}

আমি গাম্বোর সেরা, গ্রাভিটনের এবং ক্রিস জয়ের উত্তরটি নিম্নলিখিত লক্ষ্যগুলির সাথে একত্রিত করতে চেয়েছিলাম যাতে আমি এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারি:

ক) লুপ (গম্বো) এর বাইরে 'যোগ' অ্যারে কীগুলি শুরু করুন। খুব বড় অ্যারেতে পারফরম্যান্সে সহায়তা করা উচিত (এখনও পরীক্ষিত হয়নি!)। নোটিশ দূর করে।

খ) ম্যানুয়ালগুলিকে আঘাত না করে মূল যুক্তি বোঝা সহজ। (গ্রাভিটন, ক্রিস জে)।

গ) একই কী দিয়ে যে কোনও দুটি অ্যারের মান যুক্ত করার আরও সাধারণ সমস্যা সমাধান করুন এবং এটি সাব-অ্যারে কাঠামোর উপর কম নির্ভরশীল করুন।

গম্বোর সমাধানের বিপরীতে, মানগুলি সাব অ্যারেতে না থাকা ক্ষেত্রে আপনি এটি পুনরায় ব্যবহার করতে পারেন। যে নীচে উদাহরণে কল্পনা $arr1এবং $arr2হার্ড কোডেড হয় না, কিন্তু একটি লুপ ভিতরে একটি ফাংশন কলিং ফলে ফিরে হচ্ছে।

$arr1 = array(
    'gozhi' => 2,
    'uzorong' => 1,
    'ngangla' => 4,
    'langthel' => 5
);

$arr2 = array(
   'gozhi' => 5,
   'uzorong' => 0,
   'ngangla' => 3,
   'langthel' => 2
);

$sum = ArrayHelper::copyKeys($arr1);

ArrayHelper::addArrays($sum, $arr1);
ArrayHelper::addArrays($sum, $arr2);

4

এটি ব্যবহার করেও করা যেতে পারে array_walk:

function array_sum_values(array $input, $key) {
   $sum = 0;
   array_walk($input, function($item, $index, $params) {
         if (!empty($item[$params[1]]))
            $params[0] += $item[$params[1]];
      }, array(&$sum, $key)
   );
   return $sum;
}

var_dump(array_sum_values($arr, 'gozhi'));

পূর্ববর্তী সমাধানগুলির মতো পাঠযোগ্য নয় তবে এটি কার্যকর করে :)


3

এখানে এমন একটি সংস্করণ রয়েছে যেখানে অ্যারে কীগুলি উভয় অ্যারেগুলির জন্য একই নাও হতে পারে, তবে আপনি চান যে চূড়ান্ত অ্যারেটিতে সেগুলি উপস্থিত থাকে।

function array_add_by_key( $array1, $array2 ) {
    foreach ( $array2 as $k => $a ) {
        if ( array_key_exists( $k, $array1 ) ) {
            $array1[$k] += $a;
        } else {
            $array1[$k] = $a;
        }
    }
    return $array1;
}

3

অ্যারে কী বিদ্যমান কিনা আমাদের প্রথমে পরীক্ষা করা দরকার।

কোড:

$sum = array();
foreach ($array as $key => $sub_array) {
    foreach ($sub_array as $sub_key => $value) {

        //If array key doesn't exists then create and initize first before we add a value.
        //Without this we will have an Undefined index error.
        if( ! array_key_exists($sub_key, $sum)) $sum[$sub_key] = 0;

        //Add Value
        $sum[$sub_key]+=$value;
    }
}
print_r($sum);

অ্যারে কী বৈধকরণের সাথে আউটপুট:

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

অ্যারে কী বৈধকরণ ছাড়া আউটপুট:

Notice: Undefined index: gozhi in F:\web\index.php on line 37

Notice: Undefined index: uzorong in F:\web\index.php on line 37

Notice: Undefined index: ngangla in F:\web\index.php on line 37

Notice: Undefined index: langthel in F:\web\index.php on line 37

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

এটি একটি খারাপ অনুশীলন যদিও এটি আউটপুট প্রিন্ট করে। কী উপস্থিত থাকলে সর্বদা প্রথমে পরীক্ষা করে দেখুন।


1

যারা এখানে অবতরণ করেছেন এবং এমন একটি সমাধান অনুসন্ধান করছেন যা এন অ্যারেগুলিকে একীভূত করে এবং এন অ্যারেতে পাওয়া অভিন্ন কীগুলির মানগুলিরও যোগফল দেয়, আমি এই ফাংশনটি লিখেছি যা পুনরাবৃত্তির সাথে কাজ করে। (দেখুন: https://gist.github.com/ নিকোলজি / f700e319cbafab5eaedc )

উদাহরণ:

$a = array( "A" => "bob", "sum" => 10, "C" => array("x","y","z" => 50) );
$b = array( "A" => "max", "sum" => 12, "C" => array("x","y","z" => 45) );
$c = array( "A" => "tom", "sum" =>  8, "C" => array("x","y","z" => 50, "w" => 1) );

print_r(array_merge_recursive_numeric($a,$b,$c));

ফলাফল হবে:

Array
(
    [A] => tom
    [sum] => 30
    [C] => Array
        (
            [0] => x
            [1] => y
            [z] => 145
            [w] => 1
        )

)

কোডটি এখানে:

<?php 
/**
 * array_merge_recursive_numeric function.  Merges N arrays into one array AND sums the values of identical keys.
 * WARNING: If keys have values of different types, the latter values replace the previous ones.
 * 
 * Source: https://gist.github.com/Nickology/f700e319cbafab5eaedc
 * @params N arrays (all parameters must be arrays)
 * @author Nick Jouannem <nick@nickology.com>
 * @access public
 * @return void
 */
function array_merge_recursive_numeric() {

    // Gather all arrays
    $arrays = func_get_args();

    // If there's only one array, it's already merged
    if (count($arrays)==1) {
        return $arrays[0];
    }

    // Remove any items in $arrays that are NOT arrays
    foreach($arrays as $key => $array) {
        if (!is_array($array)) {
            unset($arrays[$key]);
        }
    }

    // We start by setting the first array as our final array.
    // We will merge all other arrays with this one.
    $final = array_shift($arrays);

    foreach($arrays as $b) {

        foreach($final as $key => $value) {

            // If $key does not exist in $b, then it is unique and can be safely merged
            if (!isset($b[$key])) {

                $final[$key] = $value;

            } else {

                // If $key is present in $b, then we need to merge and sum numeric values in both
                if ( is_numeric($value) && is_numeric($b[$key]) ) {
                    // If both values for these keys are numeric, we sum them
                    $final[$key] = $value + $b[$key];
                } else if (is_array($value) && is_array($b[$key])) {
                    // If both values are arrays, we recursively call ourself
                    $final[$key] = array_merge_recursive_numeric($value, $b[$key]);
                } else {
                    // If both keys exist but differ in type, then we cannot merge them.
                    // In this scenario, we will $b's value for $key is used
                    $final[$key] = $b[$key];
                }

            }

        }

        // Finally, we need to merge any keys that exist only in $b
        foreach($b as $key => $value) {
            if (!isset($final[$key])) {
                $final[$key] = $value;
            }
        }

    }

    return $final;

}

?>

1

অ্যারের প্রতিটি আইটেমটি নিয়ে যান এবং পূর্ববর্তী মানগুলিতে উপস্থিত থাকলে মানগুলি যোগ করুন, যদি কেবলমাত্র মূল্য নির্ধারণ না করে।

<?php
$array = 
[
    [
        'a'=>1,
        'b'=>1,
        'c'=>1,
    ],
    [
        'a'=>2,
        'b'=>2,
    ],
    [
        'a'=>3,
        'd'=>3,
    ]
];

$result = array_reduce($array, function($carry, $item) {
    foreach($item as $k => $v)
        $carry[$k] = $v + ($carry[$k] ?? 0);

    return $carry;
}, []);

print_r($result);

আউটপুট:

Array
(
    [a] => 6
    [b] => 3
    [c] => 1
    [d] => 3
)

বা প্রতিটি উপ অ্যারে কেবল লুপ করুন, এবং প্রতিটি কলামের জন্য মানগুলি গ্রুপ করুন। শেষ পর্যন্ত তাদের সংক্ষিপ্তসার:

foreach($array as $subarray)
    foreach($subarray as $key => $value)
        $grouped[$key][] = $value;

$sums = array_map('array_sum', $grouped);

0

আমি আপনাকে সাধারণত কিভাবে এই ধরণের অপারেশন করি তা এখানে আছে।

// We declare an empty array in wich we will store the results
$sumArray = array();

// We loop through all the key-value pairs in $myArray
foreach ($myArray as $k=>$subArray) {

   // Each value is an array, we loop through it
   foreach ($subArray as $id=>$value) {

       // If $sumArray has not $id as key we initialize it to zero  
       if(!isset($sumArray[$id])){
           $sumArray[$id] = 0;
       }

       // If the array already has a key named $id, we increment its value
       $sumArray[$id]+=$value;
    }
 }

 print_r($sumArray);

দয়া করে আপনি এই কোডটির ব্যাখ্যা দিতে পারেন এবং কেন এটি প্রশ্নের উত্তর দেয়? এটি কোনও ব্যাখ্যা ছাড়াই কেবল একটি কোড ব্লক ডাম্পিংয়ের চেয়ে আরও সহায়ক হবে।
ট্রিনকোট

অবশ্যই!! দুঃখিত, আমি স্প্যানিশ এবং আমার কাছে, কোডটি ব্যাখ্যা করাই যখন আমি কোনও প্রশ্নের উত্তর দিই তখন সবচেয়ে কঠিন জিনিস! আপনার পরামর্শের জন্য ধন্যবাদ @ ট্রিনকোট
লুইস

0

আপনি এটি চেষ্টা করতে পারেন:

$c = array_map(function () {
      return array_sum(func_get_args());
     },$a, $b);

এবং পরিশেষে:

print_r($c);

1
আপনি ঠিক কী জন্য ব্যবহার করছেন $aএবং $bযখন আপনি কল করবেন array_map()? দয়া করে এই কোড-উত্তরটি উন্নত করুন।
মিকম্যাকুসা

0

এটি আমার ল্যারাভেল প্রকল্পে দুর্দান্ত কাজ করে

print_r($Array); // your original array

$_SUM = [];

// count($Array[0]) => if the number of keys are equall in all arrays then do a count of index 0 etc.
for ($i=0; $i < count($Array[0]); $i++) {
    $_SUM[] = $Array[0][$i] + $Array[1][$i]; // do a for loop on the count 
}

print_r($_SUM); // get a sumed up array

যদিও এটি আপনার লারাভেল প্রকল্পের জন্য কাজ করতে পারে, এটি এই প্রশ্নের পক্ষে ভাল / কার্যকর সমাধান নয়।
মিকম্যাকুসা

-1
$sumArray = array();
foreach ($myArray as $k => $subArray) {
    foreach ($subArray as $id => $value) {
        if (!isset($sumArray[$id])) {
            $sumArray[$id] = 0;
        }
        $sumArray[$id]+=$value;
    }
}

এটি বহু বছর আগে অনেক উত্তর থেকে একটি সদৃশ। stackoverflow.com/a/1496697/2943403 দয়া করে আপনার নিজের পোস্ট করার আগে সমস্ত বিদ্যমান উত্তরগুলি পড়ুন যাতে একই পৃষ্ঠায় কোনও অতিরিক্ত কাজ না হয়।
মিকম্যাকুসা

-1
$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    if(!isset($sumArray[$id])){
     $sumArray[$id] =$value;
    }else {
     $sumArray[$id]+=$value;
    }
  }
}

print_r($sumArray);

`

দয়া করে পর্যালোচনা করুন আমি কীভাবে একটি ভাল উত্তর লিখি । কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়েছে কারণ তারা কীভাবে প্রশ্নটিতে সমস্যাটি সমাধান করে তা ব্যাখ্যা করে না। এটি কি করে তা ব্যাখ্যা করার জন্য আপনার উত্তরটি আপডেট করা উচিত এবং 8 বছরের পুরানো এই প্রশ্নটি ইতিমধ্যে বহু আপত্তিকৃত উত্তরের উপর কীভাবে উন্নতি করে।
ফ্লফিকিটেন

মূলত আগের উত্তর সদৃশ: stackoverflow.com/a/20532196/2943403
mickmackusa

-2

উদাহরণস্বরূপ, আপনি নীচের মত এর মতো ফলাফল থেকে সমস্ত ক্ষেত্রটি ছাঁটাতে পারেন।

আমি একটি অ্যারে থেকে 'ভারসাম্য' বাছাই করছি এবং একটি ভেরিয়েবলে সংরক্ষণ করব

$kii =   $user->pluck('balance');

তারপরে পরবর্তী লাইনে আপনি এই জাতীয় সমষ্টি করতে পারেন:

$sum =  $kii->sum(); 

আশা করি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.