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

3

我有一个包含以下值的数组

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

我已经探索了Stack Overflow并发现了许多计算基于一个关键字的总和的帖子,但在这种情况下,我想首先按日期计算数组值的总和,然后再按sku计算。 请帮忙解决这个问题。
2个回答

3
尝试以下解决方案:
<?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
                )

        )

)

0

这里有另一种解决方案,可以给您略微不同的输出,可能会或可能不会更受欢迎。

$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,
)*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接