Florian Lucke
Florian Lucke

Reputation: 109

Conditionally count values in array of arrays PHP

I have an array of arrays like this:

array('0'=> 
            array(
           'fromDate' =>2007,
           'toDate' => 2008,
           'value' => 7)
      '1'=>
            array(
            'fromDate' =>2010,
            'toDate' => ,
            'value' => 3)
      '2'=>
            array(
            'fromDate' => 2007,
            'toDate' => ,  
            'value' => 4))

I want to count 'value', add them up grouped by 'fromDate' like this:

array('0' =>
             array(
             'fromDate' => 2007,
             'sum' => 2)
      '1' =>
            array(
            'fromDate' => 2010,
            'sum' => 1))

Any help is much appreciated!

Upvotes: 0

Views: 945

Answers (2)

Sergei Gorjunov
Sergei Gorjunov

Reputation: 1799

If you want to count how many arrays with "fromDate" e.g. 2007 you have:

function countByFromDate($array) {
  $result = array();
  foreach($array as $item) {
    $fromDate = $item['fromDate'];
    if (!isset($result[$fromDate])) {
      $result[$fromDate] = array('fromDate' => $fromDate, 'sum' => 0);  
    }
    $result[$fromDate]['sum']++;
  }

  return $result; 
}

Upvotes: 1

Mark Baker
Mark Baker

Reputation: 212412

$myData = array('0'=>
            array(
           'fromDate' =>2007,
           'toDate' => 2008,
           'value' => 7),
      '1'=>
            array(
            'fromDate' =>2010,
            'toDate' => NULL,
            'value' => 3),
      '2'=>
            array(
            'fromDate' => 2007,
            'toDate' => NULL,
            'value' => 4)
);

$counts = array_reduce(
    $myData,
    function ($counter, $entry) {
        if (!isset($counter[$entry['fromDate']])) {
            $counter[$entry['fromDate']] = array(
                'fromDate' => $entry['fromDate'],
                'sum' => 1
            );
        } else {
            $counter[$entry['fromDate']]['sum']++;
        }
        return $counter;
    },
    array()
);

var_dump($counts);

Upvotes: 2

Related Questions