Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sum every last value with all previous values in array

Tags:

arrays

php

I have an array of some values which I need to convert to new array and sum every value with all previous values. For example (array length, keys and values always differ), this is what I have:

Array
(
    [0] => 1
    [1] => 1
    [2] => 5
    [3] => 1
    [4] => 1
    [7] => 1
    [8] => 3
    [9] => 1
)

and this is what I need:

Array
(
    [0] => 1
    [1] => 2
    [2] => 7
    [3] => 8
    [4] => 9
    [7] => 10
    [8] => 13
    [9] => 14
)

I tried many different ways but always stuck at something or realized that I'm wrong somewhere. I have a feeling that I'm trying to reinvent a wheel here, because I think there have to be some simple function for this, but had no luck with finding solution. This is last way I tried:

$array = array( "0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1 );
$this = current($array);
$next = next($array);
$end = next(end($array));
$sum = 0;
$newArray = array();

foreach ($array as $val){
    if($val != $end){
        $sum = ($this += $next);
        array_push($newArray, $sum);
    }
}

print_r($newArray);

..unfortunately wrong again. I spend lot of time finding ways how not to get where I need to be, can someone kick me into right direction, please?

like image 553
b3da Avatar asked Dec 28 '14 12:12

b3da


5 Answers

Suggest you to use array_slice() & array_sum()

$array = array( "0"=>1,"1"=>1,"2"=>5,"3"=>1,"4"=>1,"7"=>1,"8"=>3,"9"=>1);
$keys = array_keys($array);
$array = array_values($array);

$newArr = array();

foreach ($array as $key=>$val) {
    $newArr[] = array_sum(array_slice($array, 0, $key+1));
}
$newArr = array_combine($keys, $newArr);

print '<pre>';
print_r($newArr);
print '</pre>';

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 7
    [3] => 8
    [4] => 9
    [7] => 10
    [8] => 13
    [9] => 14
)

Reference:

  • array_slice()
  • array_sum()
  • array_combine()
  • array_keys()
like image 179
MH2K9 Avatar answered Nov 15 '22 07:11

MH2K9


let assume your array variable is $a; You can use simple for loop

    for($i=1;$i<sizeof($a);$i++)
    {
        $a[$i]=$a[$i]+$a[$i-1];
    }
like image 43
Shaiful Islam Avatar answered Nov 15 '22 08:11

Shaiful Islam


You can just go over the array sum and add to a new array (in a simple way):

$array = array( "0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1 );
var_dump($array);
$newArray = array();

$sum = 0;
foreach ($array as $a){
  $sum += $a;
  $newArray[]=$sum;
}

var_dump($newArray);
like image 22
Nimrod007 Avatar answered Nov 15 '22 07:11

Nimrod007


$sums = array_reduce($array, function (array $sums, $num) {
    return array_merge($sums, [end($sums) + $num]);
}, []);

In other words, this iterates over the array (array_reduce) and in each iteration appends (array_merge) a number to a new array ($sums) which is the sum of the previous item in the array (end($sums)) and the current number. Uses PHP 5.4+ array syntax ([]).

like image 34
deceze Avatar answered Nov 15 '22 08:11

deceze


You complicated too much. Loop trough all elements of array and add current element to sum. Then assign that sum to new array.

$array = array( "0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1 );

$sum = 0;
$newArray = array();

foreach ($array as $key=>$val){
    $sum += $val;
    $newArray[$key]=$sum;
}

Make sure to get indexes right.

like image 33
aljazerzen Avatar answered Nov 15 '22 07:11

aljazerzen