0

partId我有一个包含 a和 a的对象数组quantity。我希望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);
4

3 回答 3

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);
于 2012-05-10T15:02:42.607 回答
1

显然isset()比 稍快array_key_exists,所以你可以这样做

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

这会给你一个小小的推动。

我确实喜欢你的算法。

于 2012-05-10T15:14:11.090 回答
0

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

于 2012-05-10T15:02:16.053 回答