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

时间:2012-05-10 14:52:56

标签: php arrays performance

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

我想要这个:

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

3 个答案:

答案 0 :(得分:1)

你快到了:

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

答案 1 :(得分:1)

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

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

这会给你一点点提升。

我确实喜欢你的算法。

答案 2 :(得分:0)

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