2013-06-05 34 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

我會重組陣列(「6月4日」=>數組(30,35)),等等...... –

+0

你已經有這個實際的例子代碼。你擁有的方式不會像你現在的結構那樣按照你想要的方式工作。你如何得到開始的日期和值? –

回答

0

這是你的問題的一個可能的解決方案,但我會建議重新建設,因爲Patashu &尼古拉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圖表。

這個怎麼樣?

$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); 

在這種情況下,我們只是保持我們所見過的最後日期的軌道......如果我們的新的日期相匹配的是,我們清除它。