Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sum (sub total) array based on two keys?

Tags:

arrays

php

I have array with below values

 Array
(
    [0] => Array
        (
            [order_date] => 2016-01-01
            [sku] => RK101
            [qty] => 2
        )

    [1] => Array
        (
            [order_date] => 2016-01-01
            [sku] => RK101
            [qty] => 5
        )

    [2] => Array
        (
            [order_date] => 2016-01-01
            [sku] => RK102
            [qty] => 4
        )

    [3] => Array
        (
            [order_date] => 2016-01-02
            [sku] => RK101
            [qty] => 2
        )

    [4] => Array
        (
            [order_date] => 2016-01-02
            [sku] => RK101
            [qty] => 2
        )
)

and i want to sum the array, first by date and then by sku, i want result like below

    Array
(
    [2016-01-01] => Array
    (
        [RK101] => Array
        (
            [qty] => 7
        )
        [RK102] => Array
        (
            [qty] => 4
        )
    )
    [2016-01-01] => Array
    (
        [RK101] => Array
        (
            [qty] => 4
        )
    )
)

i have explore stack overflow and found many post that calculates the sum based on one key, by in this case i want to sum the array values based on date first and then by sku. please help with the same

like image 735
Manoj Avatar asked Dec 03 '25 15:12

Manoj


1 Answers

try below solution:

<?php
echo '<pre>';

$array = Array
(
    '0' => Array
    (
        'order_date' => '2016-01-01',
        'sku' => 'RK101',
        'qty' => 2
    ),

    '1' => Array
    (
        'order_date' => '2016-01-01',
        'sku' => 'RK101',
        'qty' => 5
    ),

    '2' => Array
    (
        'order_date' => '2016-01-01',
        'sku' => 'RK102',
        'qty' => 4
    ),

    '3' => Array
    (
        'order_date' => '2016-01-02',
        'sku' => 'RK101',
        'qty' => 2
    ),

    '4' => Array
    (
        'order_date' => '2016-01-02',
        'sku' => 'RK101',
        'qty' => 2
    )
);

$new_array = array();
foreach ($array as $a) {
    if (!isset($new_array[$a['order_date']][$a['sku']]['qty'])) {
        $new_array[$a['order_date']][$a['sku']]['qty'] = 0;
    }
    $new_array[$a['order_date']][$a['sku']]['qty'] += $a['qty'];
}

print_r($new_array);

output:

Array
(
    [2016-01-01] => Array
        (
            [RK101] => Array
                (
                    [qty] => 7
                )

            [RK102] => Array
                (
                    [qty] => 4
                )

        )

    [2016-01-02] => Array
        (
            [RK101] => Array
                (
                    [qty] => 4
                )

        )

)
like image 99
Chetan Ameta Avatar answered Dec 06 '25 05:12

Chetan Ameta