Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 减少(组合)包含对象的数组最有效的方法是什么?_Php_Arrays_Performance - Fatal编程技术网

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
,我没有想到:-)