2012-05-10 8 views
0

私はpartIdquantityを含むオブジェクトの配列を持っています。最終的な配列の各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 
     ) 
) 

はここで良い方法がなければならないように私は感じて、私が今やっているものです。おそらく元を反復し、各要素のいずれか、さもなければインクリメントキーの値がnullの場合、一時的な連想配列にオブジェクトを挿入し、キーとしてpartIdと一時的なデータ構造として連想配列を使用して

$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); 

答えて

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); 
+0

これは、オブジェクト自体ではなく、一時テーブルに 'partId、key'ペアを保存し、元の配列を操作しています...そうですか? – nachito

+0

@nachitoはい。あなたはforeachの後で設定解除できる一時配列しか持っていません。数量が追加され、複製が設定されていないか、一時配列の新しいレコードが保存されます。元の配列が操作されます。 – shadyyx

0

元の配列内のオブジェクトからの量だけ既存のオブジェクトを削除します。あなたは、ほとんど存在し

+1

私はほぼ同じ答えを投稿しましたが、彼のアルゴリズムを見て、それはまさに彼がやっていることです! :) – joepetrakovich

+0

しかし、量を増やすだけでは十分ではありません - 元のものに重複したエントリーの量を加えなければなりません... – shadyyx

+0

はい、元の配列の値だけ増分します。 1'。 – Baxter

1

どうやらisset()はそうあなたがあなたに若干のブーストを与えるだろう

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

を行うことができ、わずかに速くarray_key_existsより です。

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

+0

'isset($ tmp [$ item-> partId])'を使うとき、 '||を呼び出す必要はありません。 '@ item_data_exists($ item-> partId、$ tmp)' - できれば私は 'isset'を使います。私の心には来ませんでした:-) – shadyyx

+0

@shadyyx、よろしくお願いします。私はそれが事実かもしれないと考えていた。 – joepetrakovich

関連する問題