2010-11-24 18 views
1

私は、オーダーのリストを簡単に概観するためのスクリプトを書こうとしています。配列から重複を削除して値を増やす

私はこのようになります配列があります。私は何をしたいか

Array(

    [0]=>Array(
       [0] => name of product 1 
       [1] => name of options for product 
       [3] => quantity (an integer) 
      ) 
    [1]=>Array(
       [0] => name of product 2 
       [1] => name of options for product 
       [3] => quantity (an integer) 
      ) 
    etc. 
) 

は、キーが[0]と[1]、同じオプションと同じ製品、すなわちどこをチェックし、重複を削除することです。同時に、値[3]を削除された配列の数値で増分します。簡単にするために、私はproductとoptionsがマッチするvalue [3]をマージしたいと思っています。私はこれについて長いこと考えてきましたが、それをどうやって行うのか分かりません。助言がありますか?

答えて

3

あなたは、配列をループとは、製品の「カウント」する連想配列を使用することができます。

$merged = array(); 

foreach($products as $product) { 
    $key = $product[0] . $product[1]; 
    if(!array_key_exists($key, $merged)) { 
     $merged[$key] = $product; 
    } 
    else { 
     $merged[$key][3] += $product[3]; 
    } 
} 

ここにトリックが名および製品のオプションは、ユニークなプロダクトキーを形成するために連結されていることです。もちろん、製品のオプションは常に同じ順序である必要があります。

Working Demo

+0

ループ!これは私の目的にとって素晴らしいスクリプトです。私はin_array()を使って実験していましたが、それほど遠くには行きませんでした。どうもありがとう! – Toxid

0

デュアルうわー

 
<?php 
for($counter=0;$counter<count($arr)-1;$counter++){ 
    $counter2 = $counter+1; 
    while($counter2<count($arr)) { 
    if($arr[$counter][0] == $arr[$counter2][0] && 
     $arr[$counter][1] == $arr[$counter2][1]) { 
     // Same product 
     $arr[$counter][2]+=$arr[$counter2][2]; 
     array_splice($arr, $counter2, 1); 
    } else { 
     $counter2++; 
    } 
    } 
} 
?> 
+0

これはO(n^2)であり、大きなリストではひどく遅くなることに注意してください。 – dkamins

+0

真ですが、$ arrに参照が1つしかない場合、array_spliceは配列に新しいメモリを割り当てません。要素を削除してもしなくてもよい配列のコピーを作成すると、メモリ使用量が最大で2倍になります。大きなリストを使用すると、使用可能なPHPメモリが不足する可能性が高くなります。 – Rahly