Morten Hagh Morten Hagh - 1 month ago 10
PHP Question

Sum values on specific keys in multiple arrays on matching value

I have a quite large dynamic array fetched from Facebook containing insights data ( expanded with some other values )

array (size=8)
0 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033718991' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '102' (length=3)
'cost_per_inline_link_click' => string '9.224138' (length=8)
'cpm' => string '23.723653' (length=9)
'cpp' => string '745.817844' (length=10)
'ctr' => string '0.301534' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '33827' (length=5)
'inline_link_clicks' => string '87' (length=2)
'reach' => string '1076' (length=4)
'spend' => string '802.5' (length=5)
'unique_clicks' => string '71' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
1 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033669391' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '940' (length=3)
'cost_per_inline_link_click' => string '4.21121' (length=7)
'cpm' => string '18.654177' (length=9)
'cpp' => string '304.317408' (length=10)
'ctr' => string '0.530429' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '177215' (length=6)
'inline_link_clicks' => string '785' (length=3)
'reach' => string '10863' (length=5)
'spend' => string '3305.8' (length=6)
'unique_clicks' => string '585' (length=3)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
2 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053717634591' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '106' (length=3)
'cost_per_inline_link_click' => string '6.627547' (length=8)
'cpm' => string '31.457997' (length=9)
'cpp' => string '61.646192' (length=9)
'ctr' => string '0.94931' (length=7)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '11166' (length=5)
'inline_link_clicks' => string '53' (length=2)
'reach' => string '5698' (length=4)
'spend' => string '351.26' (length=6)
'unique_clicks' => string '90' (length=2)
1 =>
array (size=7)
'status' => string 'campaign_paused
' (length=17)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
3 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053404622991' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '19' (length=2)
'cost_per_inline_link_click' => string '9.9025' (length=6)
'cpm' => string '31.943548' (length=9)
'cpp' => string '73.899254' (length=9)
'ctr' => string '0.766129' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '2480' (length=4)
'inline_link_clicks' => string '8' (length=1)
'reach' => string '1072' (length=4)
'spend' => string '79.22' (length=5)
'unique_clicks' => string '17' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
4 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053404572991' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '49' (length=2)
'cost_per_inline_link_click' => string '10.9524' (length=7)
'cpm' => string '57.067528' (length=9)
'cpp' => string '88.899351' (length=9)
'ctr' => string '1.021259' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '4798' (length=4)
'inline_link_clicks' => string '25' (length=2)
'reach' => string '3080' (length=4)
'spend' => string '273.81' (length=6)
'unique_clicks' => string '34' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
5 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6039438663591' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '1440' (length=4)
'cost_per_inline_link_click' => string '17.057895' (length=9)
'cpm' => string '60.323048' (length=9)
'cpp' => string '345.106481' (length=10)
'ctr' => string '1.165303' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '123573' (length=6)
'inline_link_clicks' => string '437' (length=3)
'reach' => string '21600' (length=5)
'spend' => string '7454.3' (length=6)
'unique_clicks' => string '1010' (length=4)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
6 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6039438653791' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '332' (length=3)
'cost_per_inline_link_click' => string '14.831231' (length=9)
'cpm' => string '60.289556' (length=9)
'cpp' => string '206.563103' (length=10)
'ctr' => string '1.038149' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '31980' (length=5)
'inline_link_clicks' => string '130' (length=3)
'reach' => string '9334' (length=4)
'spend' => string '1928.06' (length=7)
'unique_clicks' => string '245' (length=3)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
7 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6038268312591' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '112' (length=3)
'cost_per_inline_link_click' => string '5.063291' (length=8)
'cpm' => string '41.968314' (length=9)
'cpp' => string '81.984013' (length=9)
'ctr' => string '1.175113' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '9531' (length=4)
'inline_link_clicks' => string '79' (length=2)
'reach' => string '4879' (length=4)
'spend' => string '400' (length=3)
'unique_clicks' => string '96' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
C:\Development\Projects\PHP\SparNord.LeadsData\SparNord.LeadsData\app\Controllers\InsightsDataController.php:78:
array (size=8)
0 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033718991' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '102' (length=3)
'cost_per_inline_link_click' => string '9.224138' (length=8)
'cpm' => string '23.723653' (length=9)
'cpp' => string '745.817844' (length=10)
'ctr' => string '0.301534' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '33827' (length=5)
'inline_link_clicks' => string '87' (length=2)
'reach' => string '1076' (length=4)
'spend' => string '802.5' (length=5)
'unique_clicks' => string '71' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
1 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033669391' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '940' (length=3)
'cost_per_inline_link_click' => string '4.21121' (length=7)
'cpm' => string '18.654177' (length=9)
'cpp' => string '304.317408' (length=10)
'ctr' => string '0.530429' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '177215' (length=6)
'inline_link_clicks' => string '785' (length=3)
'reach' => string '10863' (length=5)
'spend' => string '3305.8' (length=6)
'unique_clicks' => string '585' (length=3)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
2 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053717634591' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '106' (length=3)
'cost_per_inline_link_click' => string '6.627547' (length=8)
'cpm' => string '31.457997' (length=9)
'cpp' => string '61.646192' (length=9)
'ctr' => string '0.94931' (length=7)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '11166' (length=5)
'inline_link_clicks' => string '53' (length=2)
'reach' => string '5698' (length=4)
'spend' => string '351.26' (length=6)
'unique_clicks' => string '90' (length=2)
1 =>
array (size=7)
'status' => string 'campaign_paused
' (length=17)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
3 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053404622991' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '19' (length=2)
'cost_per_inline_link_click' => string '9.9025' (length=6)
'cpm' => string '31.943548' (length=9)
'cpp' => string '73.899254' (length=9)
'ctr' => string '0.766129' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '2480' (length=4)
'inline_link_clicks' => string '8' (length=1)
'reach' => string '1072' (length=4)
'spend' => string '79.22' (length=5)
'unique_clicks' => string '17' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
4 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6053404572991' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '49' (length=2)
'cost_per_inline_link_click' => string '10.9524' (length=7)
'cpm' => string '57.067528' (length=9)
'cpp' => string '88.899351' (length=9)
'ctr' => string '1.021259' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '4798' (length=4)
'inline_link_clicks' => string '25' (length=2)
'reach' => string '3080' (length=4)
'spend' => string '273.81' (length=6)
'unique_clicks' => string '34' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
5 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6039438663591' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '1440' (length=4)
'cost_per_inline_link_click' => string '17.057895' (length=9)
'cpm' => string '60.323048' (length=9)
'cpp' => string '345.106481' (length=10)
'ctr' => string '1.165303' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '123573' (length=6)
'inline_link_clicks' => string '437' (length=3)
'reach' => string '21600' (length=5)
'spend' => string '7454.3' (length=6)
'unique_clicks' => string '1010' (length=4)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
6 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6039438653791' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '332' (length=3)
'cost_per_inline_link_click' => string '14.831231' (length=9)
'cpm' => string '60.289556' (length=9)
'cpp' => string '206.563103' (length=10)
'ctr' => string '1.038149' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '31980' (length=5)
'inline_link_clicks' => string '130' (length=3)
'reach' => string '9334' (length=4)
'spend' => string '1928.06' (length=7)
'unique_clicks' => string '245' (length=3)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
7 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6038268312591' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6037440286791' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '112' (length=3)
'cost_per_inline_link_click' => string '5.063291' (length=8)
'cpm' => string '41.968314' (length=9)
'cpp' => string '81.984013' (length=9)
'ctr' => string '1.175113' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '9531' (length=4)
'inline_link_clicks' => string '79' (length=2)
'reach' => string '4879' (length=4)
'spend' => string '400' (length=3)
'unique_clicks' => string '96' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)


How can I merge these arrays and sum values on specific keys (clicks, cpm, ctr, impressions, reach, spend) where the key
'shortname'
is identical so that I will get only one array with each shortname, where the values on the spefific keys are added up so my result will be like

array (size=8)
0 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033718991' (length=13)
'adset_name' => string 'Greve - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '102' (length=3)
'cost_per_inline_link_click' => string '9.224138' (length=8)
'cpm' => string '23.723653' (length=9)
'cpp' => string '745.817844' (length=10)
'ctr' => string '0.301534' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '33827' (length=5)
'inline_link_clicks' => string '87' (length=2)
'reach' => string '1076' (length=4)
'spend' => string '802.5' (length=5)
'unique_clicks' => string '71' (length=2)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'greve' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)
1 =>
array (size=2)
0 =>
array (size=16)
'adset_id' => string '6054033669391' (length=13)
'adset_name' => string 'Køge - MSN' (length=11)
'campaign_id' => string '6054033668391' (length=13)
'campaign_name' => string 'Køge - MSN' (length=11)
'clicks' => string '940' (length=3)
'cost_per_inline_link_click' => string '4.21121' (length=7)
'cpm' => string '18.654177' (length=9)
'cpp' => string '304.317408' (length=10)
'ctr' => string '0.530429' (length=8)
'date_start' => string '2016-01-01' (length=10)
'date_stop' => string '2016-10-25' (length=10)
'impressions' => string '177215' (length=6)
'inline_link_clicks' => string '785' (length=3)
'reach' => string '10863' (length=5)
'spend' => string '3305.8' (length=6)
'unique_clicks' => string '585' (length=3)
1 =>
array (size=7)
'status' => string 'paused
' (length=8)
'bankarea' => string 'koege' (length=5)
'shortname' => string 'koege' (length=5)
'campaign' => string 'msn' (length=3)
'platform' => string 'facebook' (length=8)
'datefrom' => string '2016-01-01' (length=10)
'dateto' => string '2016-10-25' (length=10)


Where the values on keys
clicks, cpm, ctr, impressions, reach, spend
are added up ( there are not in my example above )

Answer

This should do what you want:

$props_to_sum = ["cpm", "clicks", "reach"];

$result = [];
foreach ($data as $entry) {
    $key = $entry[1]['shortname'];
    if (!array_key_exists($key, $result)) {
        $result[$key] = $entry;
        continue;
    }
    foreach ($props_to_sum as $prop) {
        $result[$key][0][$prop] += $entry[0][$prop];
    }
}
$result = array_values($result);