McClaudLive
McClaudLive

Reputation: 53

PHP array: Conditional sum

I have a an array looking like this:

$array = array("a1" => 0, "a2" => 2, "a3" => 1, "b1" => 2, "b2" => 3);

I would like to sum values foreach "unique" key when only the first character is considered. The result should then be:

$newarray = array("a" => 3, "b" => 5);

I have tried using a foreach() loop within another foreach() loop like this:

foreach ($xml->children() as $output) {
  foreach ($array as $key => $value) {
    if (substr($key,0,1) == $output->KEY) {
      $sum += $value; echo $sum;
    }
  }
}

It didn't work as the results apparently added the prior calculations.

Upvotes: 1

Views: 3647

Answers (5)

Death-is-the-real-truth
Death-is-the-real-truth

Reputation: 72299

Simple solution:

$final_array=[];
foreach($array as $key=>$value){
     $final_array[$key[0]] =  (isset($final_array[$key[0]])) ? $final_array[$key[0]]+$value : $value;
 }
 print_r($final_array);

Output:- https://3v4l.org/tZ4Ei

Upvotes: 2

Tamim
Tamim

Reputation: 1036

Try this way

$array = array('a1' => 0, 'a2' => 2, 'a3' => 3, 'b1' => 2, 'b2' => 3);
$result = array();
foreach($array as $key => $value){
    if(isset($result[$key[0]])){
        $result[$key[0]] = $result[$key[0]]+$value;
    } else {
        $result[$key[0]] = $value;
    }
}
print_r($result);

Upvotes: 1

Anuga
Anuga

Reputation: 2827

Quick and Easy, you can have any number of numbers in the array after the characters.

<?php

$array = ["a1" => 0, "a2" => 2, "a3" => 1, "b1" => 2, "b2" => 3];
$newArray = [];

foreach ($array as $key => $value) {
  $key = preg_replace("/[0-9]*$/", "", $key);
  $newArray[$key] = (isset($newArray[$key])) ? $newArray[$key] + $value : $value;
}

print_r($newArray);

Upvotes: 0

Salman Arshad
Salman Arshad

Reputation: 272216

A simple isset should do it:

$array = array("a1" => 0, "a2" => 2, "a3" => 1, "b1" => 2, "b2" => 3);
$result = array();
foreach ($array as $oldkey => $val) {
    $newkey = substr($oldkey, 0, 1);
    if (isset($result[$newkey]) === false)
        $result[$newkey] = $val;
    else
        $result[$newkey] += $val;
}
var_dump($result);

Upvotes: 1

JohnnyB1988
JohnnyB1988

Reputation: 178

You can try this one. It will take first letter from your key and make sum of all values with that first letter keys.

<?php
$sum = [];
foreach ($array as $key => $value) {
    $letter = substr($key,0,1);
    if (!isset($sum[$letter])){$sum[$letter] = 0;}
    $sum[$letter] += $value;
}

var_dump($sum);

Upvotes: 1

Related Questions