2010-11-24 6 views
1

주문 목록을 쉽게 볼 수 있도록 스크립트를 작성하려고합니다.배열에서 중복 항목을 제거하고 값을 증가 시키십시오.

I은 ​​다음과 같습니다 배열을 가지고 :

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

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에 하나의 참조 만있는 경우 array_splice는 배열에 대해 새 메모리를 할당하지 않습니다. 요소를 제거하거나 제거하지 않을 수있는 배열 복사본을 만들면 메모리 사용량이 최대 두 배가됩니다. 큰 목록을 사용하면 사용 가능한 PHP 메모리가 부족할 확률이 높아집니다. – Rahly

관련 문제