在PHP中,合并多维数组的重复元素集并对特定键的值求和

时间:2014-06-10 20:14:05

标签: php arrays multidimensional-array sum duplicates

我有以下数组,我尝试合并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
        )
)

目前,我通过以下字段shelfweightpiece创建临时表并插入所有四个值并解析导致PHP具有以下选择查询

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)合并数组和总和值,但在我的情况下,它的唯一性被判断关于元素的组合(不是一个)

123

1 个答案:

答案 0 :(得分:2)

如果您必须在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);

会起作用,但我确实相信你会因为你对这个问题的整体解决方法而为自己造成重大的性能问题