0

partIdaと aを含むオブジェクトの配列がありますquantity。オブジェクトpartIdquantityを同じ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

どうやらisset()よりも少し速いのでarray_key_exists、あなたはすることができます

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

それはあなたにわずかな後押しを与えるでしょう。

私はあなたのアルゴリズムが好きです。

于 2012-05-10T15:14:11.090 に答える
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 に答える
0

おそらく連想配列をpartIdをキーとして一時的なデータ構造として使用し、元の要素を繰り返し処理し、キーの値がnullの場合はオブジェクトを一時的な連想配列に挿入し、そうでない場合は既存のオブジェクトを元の配列内のオブジェクト。

于 2012-05-10T15:02:16.053 に答える