减少(组合)包含对象的数组的最有效方法是什么


What is the most effecient way to reduce (combine) an array containing objects?

我有一个包含partIdquantity的对象数组。我希望最终数组中的每个partId都是唯一的,方法是将具有相同partId的对象quantity求和。

我想要这个:

Array
(
    [0] => stdClass Object
        (
            [partId] => 232032
            [quantity] => 2
        )
    [1] => stdClass Object
        (
            [partId] => 232032
            [quantity] => 1
        )
    [2] => stdClass Object
        (
            [partId] => 232031
            [quantity] => 1
        )
)

以这样的方式结束:

Array
(
    [0] => stdClass Object
        (
            [partId] => 232032
            [quantity] => 3
        )
    [1] => stdClass Object
        (
            [partId] => 232031
            [quantity] => 1
        )
)

这就是我现在正在做的事情,我觉得必须有更好的方法。

$tmp = array();
foreach ($array1 as $item) {
    if (array_key_exists($item->partId, $tmp)) {
        $tmp[$item->partId]->quantity += $item->quantity;
    } else {
        $tmp[$item->partId] = $item;
    }
}
$array2 = array_merge($tmp);

你快到了:

$tmp = array();
foreach ($array1 as $key => $item) {
    if (array_key_exists($item->partId, $tmp)) {
        $array1[$tmp[$item->partId]]->quantity += $item->quantity;
        unset($array1[$key]);
    } else {
        $tmp[$item->partId] = $key;
    }
}
print_r($array1);

显然isset()array_key_exists略快,所以你可以做

if ( isset($tmp[$item->partId]) || array_key_exists($item->partId, $tmp) )
{
    ...
}

这会给你带来一点提升。

不过,我喜欢你的算法。

可能使用关联数组作为临时数据结构,以 partId 作为键,然后遍历原始元素,如果键的值为 null,则为每个元素将对象插入临时关联数组,否则将现有对象按原始数组中对象的数量递增。