2010-11-24 64 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