2013-06-05 5 views
1

다양한 순열을 array_unique 시도했지만 배열에서 중복 값을 제거하는 다른 일반적인 질문을 검색했습니다. 그러나 필자는 필요한 답변을 설정할 수 없습니다. 배열에 날짜와 값이 전달되고 날짜별로 한 번만 DATE 값을보고 싶습니다.PHP 배열의 중복 된 날짜 인스턴스를 제거합니다

Google 차트에 사용하고 있으며 날짜 라벨을 각 날짜에 한 번만 표시하고 싶습니다. 그리고 차트에 그것을 그릴 수 있기를 원하기 때문에 전적으로 제거하고 싶지 않습니다.

["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12] 

을 그리고 나는 그것을 할 방법 :

그래서, 예를 들어 배열이 전달되는

["June 4",30],["",35],["June 5",46],["",38.33],["",12] 

아이디어?

+4

날짜 레이블에서 값으로 연결 배열을 만드시겠습니까? 그렇게하면 같은 날짜 라벨을 가진 두 개의 엔트리를 추가하면 하나의 엔트리로 끝날 것이고 하나의 값으로 끝날 것입니다. – Patashu

+2

나는 array ("June 4"=> array (30,35))와 같은 배열을 재구성 할 것이고 ... –

+0

당신은 이미 이것의 실제 예제 코드를 가지고 있습니까? 당신이 가진 방식은 그것이 현재의 구조와 함께 당신이 원하는 방식으로 작동하지 않을 것입니다. 날짜와 값은 어떻게 시작합니까? –

답변

0

Patashu & Nikola R이 명시된대로 재구성을 권장하지만이 방법이 문제의 가능한 해결책입니다.

$untrimmed = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]]; 
$trimmed = stripDates($untrimmed); 

function stripDates($dates) { 
    foreach($dates as $key=>$date) { 
     if ($key>0) { 
      if ($date[0] === $dates[$key-1][0]) { 
       $dates[$key][0] = ""; 
      } else if($dates[$key-1][0] === "") { 
       for ($i = $key-1; $i > -1; $i--) { 
        if ($date[0] === $dates[$i][0]) $dates[$key][0] = ""; 
        if ($dates[$key] != "") break; 
       } 
      } 
     } 
    } 
    return $dates; 
} 

// Note: This would require dates to be added chronically 
//Output: ["June 4",30],["",35],["June 5",46],["",38.33],["",12] 

나는 이런 식으로 뭔가를 추천 할 것입니다 :

$unconstructed = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]]; 
$constructed = constructAssoc($unconstructed); 

function constructAssoc($dates) { 
    $constructed = array(); 
    foreach($dates as $index=>$date) { 
     if (!array_key_exists($date[0], $constructed)) { 
      $constructed[$date[0]] = array("index"=>$index, "value"=>$date[1]); 
     } else { 
      array_push($constructed[$date[0], ["index"=>$index,"value"=>$date[1]]); 
     } 
    } 
    return $constructed; 
} 

//Output: ["June 4"=> [["index"=>0, "value"=>30], ["index"=>1, "value"=>35]], "June 5"=>[["index"=>2, "value"=>46], ["index"=>3, "value"=>38.33], ["index"=>4, "value"=>12]]] 

주 : 추가 인덱스를 권장 솔루션에 대한보다 정확한 재 건설이 필요합니다.

+0

데이터 세트가 매우 커지면이 솔루션의 중첩 루프가 오랜 시간이 걸릴 것입니다. O (n^2) 알고리즘 – jcsanyi

+0

권장 솔루션의 경우 어떻게 차트 작성에 필요한 형식으로 되돌릴 수 있습니까? ? – jcsanyi

+0

향상된 성능을위한 중단 솔루션을 추가했습니다. 두 번째 주석에 대해서는 각 값에 각 색인을 추가하지 않는 한 동일한 위치에 가져올 수 없습니다. – leko

0

데이터를 Google 차트에 입력하기 때문에 출력 데이터까지 필요한 정보를 정확히 알고 있다고 가정합니다. 이미 데이터를 구조화하는 더 좋은 방법에 대한 몇 가지 제안이 있지만 Google 차트에는 직접 적용되지 않습니다.

어때요?

$data = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]]; 
$found = array(); 
foreach ($data as $i => $x) { 
    if (in_array($x[0], $found)) { 
     $data[$i][0] = ''; 
    } else { 
     $found[] = $x[0]; 
    } 
} 
print_r($data); 

기본적으로, 그냥 이미 본 것 날짜의 목록을 작성합니다. 데이터를 순환하여 날짜를 확인했는지 확인합니다. 데이터가 있으면 데이터에서 데이터를 지 웁니다. 그렇지 않으면 데이터를 목록에 저장하여 다음에 지울 것입니다.

여기에만 모든 중복 제거 최초의 솔루션과는 달리, 연속 있습니다 중복 된 날짜를 확인합니다 대체 솔루션입니다. 우리는 단지 우리가 본 마지막 날짜를 추적 유지하고 ... 그리고 우리의 새로운 날짜가 일치하는 경우, 우리는 그것을 삭제이 경우

$data = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]]; 
$last = ''; 
foreach ($data as $i => $x) { 
    if ($x[0] == $last) { 
     $data[$i][0] = ''; 
    } else { 
     $last = $x[0]; 
    } 
} 
print_r($data); 

: 이것은 당신이 차트에 필요한 것과 아마 가까운 .

관련 문제