2

I have the following collection that contains the arrays below:

  #items: array:2 [▼
    0 => array:13 [▼

      "label" => "00000000-N/A"
      "views" => 980
      "clicks" => 444
      "form_submissions_perc" => "100.0"

    ]
    1 => array:13 [▼

      "label" => "1111-N/A"
      "views" => 323
      "clicks" => 1009
      "form_submissions_perc" => "100.0"

    ]
  ]

I am trying to sum clicks and average views but in my try I get the wrong data:

   $sum = 0;

    foreach ($data as $k => $subArray) {

        foreach ($subArray as $id => $value) {

            $sum += $subArray['views'];
        }

    }

    dd($sum);

This was my try to sum but didnt get the right results

Desired output

   array:2 [

       "views"=> 1303,
       "clicks"=> 1451

    ]
PrStandup
  • 313
  • 1
  • 4
  • 14

4 Answers4

6

Use $sum as array and get correct value of multiarray:

$sum = array(
       'clicks' => 0,
       'views' => 0
       );

foreach ($data as $id => $value) {
    $sum['clicks'] += $value['clicks'];
    $sum['views'] += $value['views'];
}

dd($sum);
JustBaron
  • 2,319
  • 7
  • 25
  • 37
Vladimir
  • 1,373
  • 8
  • 12
1
   foreach ($data as $k => $subArray) {
        $valueSum[] = $subArray['views'];
        $clickSum[] = $subArray['clicks'];
    }
    echo array_sum($valueSum);
    echo array_sum($clickSum);

this is also a clean and easy way .

samehanwar
  • 3,280
  • 2
  • 23
  • 26
0
$data = [
            [
                "label"                 => "00000000-N/A",
                "views"                 => 980,
                "clicks"                => 444,
                "form_submissions_perc" => "100.0"
            ],
            [
                "label"                 => "1111-N/A",
                "views"                 => 323,
                "clicks"                => 1009,
                "form_submissions_perc" => "100.0"
            ]
        ];

        $result['views']  = array_sum( array_column( $data, 'views' ) );
        $result['clicks'] = array_sum( array_column( $data, 'clicks' ) );

        dd( $result );

This is the easiest way to do your work.

Result:

Array ( [views] => 1303 [clicks] => 1453 )
localroot
  • 566
  • 3
  • 13
0

You can use array_reduce instead

$data = array_reduce($array, function ($old, $new) {
    return [
        "view" => $old["view"] + $new["view"],
        "clicks" => $old["clicks"] + $new["clicks"]
    ];
}, ["view" => 0, "clicks" => 0]);

print '<pre>';
print_r($data);
MH2K9
  • 11,951
  • 7
  • 32
  • 49