如何根据两个键对数组求和(小计)


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

>我有以下值的数组

 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
        )
)

我想对数组求和,首先按日期,然后按 SKU,我想要如下结果

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

我已经探索了堆栈溢出,并发现许多基于一个键计算总和的帖子,在这种情况下,我想首先根据日期对数组值求和,然后按 SKU。请帮助相同

请尝试以下解决方案:

<?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);

输出:

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

这是另一种解决方案,它为您提供的输出略有不同,可能是首选,也可能不是首选。

$results = array();
$myNums = array(
    array(
        'order_date' => '2016-01-01',
        'sku' => 'RK101',
        'qty' => 2,
    ),
    array(
        'order_date' => '2016-01-01',
        'sku' => 'RK101',
        'qty' => 1,
    ),
    array(
        'order_date' => '2016-01-02',
        'sku' => 'RK101',
        'qty' => 2,
    ),
);
foreach ($myNums as $num) {
    $key = "{$num['order_date']}|{$num['sku']}";
    if (! array_key_exists($key, $results)) {
        $results[$key] = 0;
    }
    $results[$key] += $num['qty'];
}
var_dump($results);
/*
var_dump gives the following...
 Array
(
    [2016-01-01|RK101] => 3,
    [2016-01-02|RK101] => 2,
)*/