根据两个列值对行进行分组,并对特定键的值求和


Group rows on two column values and sum the values of specific key

我有以下数组,我试图合并具有shelfweight值的元素,并将piece键的值求和。

Array
(
    [0] => Array
        (
            [shelf] => Left
            [weight] => 10.000
            [piece] => 1
        )
    [1] => Array
        (
            [shelf] => Right
            [weight] => 04.000
            [piece] => 12
        )
    [2] => Array
        (
            [shelf] => Right
            [weight] => 04.000
            [piece] => 4
        )
    [3] => Array
        (
            [shelf] => Right
            [weight] => 07.000
            [piece] => 8
        )
)

目前,我通过创建具有以下字段shelf, weightpiece的临时表并插入所有四个值并在PHP中使用以下选择查询解析结果

,在以下SQL语句的帮助下获得以下所需的输出

SELECT shelf, weight, SUM(piece) FROM temp GROUP BY CONCAT(shelf, weight)

Array
(
    [0] => Array
        (
            [shelf] => Left
            [weight] => 10.000
            [piece] => 1
        )
    [1] => Array
        (
            [shelf] => Right
            [weight] => 04.000
            [piece] => 16
        )
    [3] => Array
        (
            [shelf] => Right
            [weight] => 07.000
            [piece] => 8
        )
 )

然而,我相信这可以简单地通过PHP实现,但不能得到我的头。谁能指出我可能遗漏了什么?

给版主和SO Vigilante的说明

请不要把它个人化,但在标记或甚至说这是重复的之前,请彻底阅读我的问题并理解我想要达到的目的,只有在你同意的情况下,请详细解释为什么你认为它是重复的,而不是简单地根据类似标题的问题争论

我已经经历了这些问题,但它们在我的场景中不起作用,因为它们试图根据一个特定的元素合并数组和求和值,通常是ID,但在我的情况下,它的唯一性是根据元素的组合来判断的(不是一个)

1,2,3

如果你必须在PHP中这样做,那么像这样:

$data = array(
    array(
        'shelf' => 'Left',
        'weight' => '10.000',
        'piece' => 1,
    ),
    array(
        'shelf' => 'Right',
        'weight' => '04.000',
        'piece' => 12,
    ),
    array(
        'shelf' => 'Right',
        'weight' => '04.000',
        'piece' => 4,
    ),
    array(
        'shelf' => 'Right',
        'weight' => '07.000',
        'piece' => 8,
    ),
);

$newData = array();
$result = array_reduce(
    $data,
    function($newData, $value) {
        $key = $value['shelf'].$value['weight'];
        if (!isset($newData[$key])) {
            $newData[$key] = $value;
        } else {
            $newData[$key]['piece'] += $value['piece'];
        }
        return $newData;
    },
    $newData
);
var_dump($result);

将工作,但我真的相信,你的整个方法是为自己制造主要的性能问题