2010-11-24 63 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]隨着刪除數組中的數字而增加。爲了簡化,我想合併產品和選項匹配的值[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 2010-11-25 00:56:46

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 2010-11-25 00:31:18