Php 减少(组合)包含对象的数组最有效的方法是什么?
我有一个包含Php 减少(组合)包含对象的数组最有效的方法是什么?,php,arrays,performance,Php,Arrays,Performance,我有一个包含partId和quantity的对象数组。我希望最后一个数组中的每个partId都是唯一的,方法是将具有相同partId的对象的quantity相加 我想要这个: Array ( [0] => stdClass Object ( [partId] => 232032 [quantity] => 2 ) [1] => stdClass Object
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);
可能使用关联数组作为临时数据结构,partId作为键,然后遍历原始元素,对于每个元素,如果键的值为null,则将对象插入临时关联数组,否则将现有对象的数量增加原始数组中对象的数量。您几乎做到了:
$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\u key\u存在的速度稍快一些
,
所以你可以
if ( isset($tmp[$item->partId]) || array_key_exists($item->partId, $tmp) )
{
...
}
那会给你一点提振
不过我确实喜欢你的算法。我几乎贴出了同样的答案,但在看了他的算法后,他就是这么做的!:)但是仅仅增加数量是不够的-他必须将重复条目的数量添加到原始条目的数量中…是的,您将按原始数组中的值进行增量,增量不必表示“增加一”。@Baxter好的,对不起,我以为您的意思是增加一。再一次,对不起!在将元素的数量设置为第一次出现的数量后,他正在执行+=$item->quantity。他已经在做你的建议了。所以这是在临时表中保存
partId,key
对,而不是对象本身,并操作原始数组。。。是吗?@nachito是的。只有一个临时数组可以在foreach之后取消设置。操作原始数组-要么添加数量,要么取消复制,要么保存临时数组的新记录。当使用isset($tmp[$item->partId])
时,无需调用|array\u key_exists($item->partId,$tmp)
-我最好使用isset
,我没有想到:-)