我有一个包含partId
和quantity
的对象数组。我希望最终数组中的每个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,则为每个元素将对象插入临时关联数组,否则将现有对象按原始数组中对象的数量递增。