2010-10-07 116 views
2

我不太瞭解PHP,所以請耐心等待。PHP Array_Unique問題

我的客戶端有一個包含信息的數據庫,其中一個字段是ff_date_time,格式爲「Tue Oct 5 14:43:10 2010」。在這裏有很多條目,我需要顯示一個只有有條目的日子列表:即,

  • 星期二2010年10月5日星期二
  • 星期四2010年10月7日
等。在某一天可能會有數百個條目,所以很顯然,當我從db中取得日期時,我需要經過並提取正確的數據並對其進行過濾。這是我到目前爲止有:

$query = "SELECT ff_date_time FROM booth_submit"; 
$query_result = mysql_query($query); 
$datetimes = array(); 
$dates = array(); 

while ($row = mysql_fetch_array($query_result)) { 
    $datetimes[] = $row['ff_date_time']; 
} 

for ($i = 0; $i < sizeOf($datetimes); $i++) { 
    $temp = explode(" ", $datetimes[$i]); 
    $dates[] = ($temp[0]." ".$temp[1]." ".$temp[2]." ".$temp[4]); # Breaks date_time into 'Mon Oct 5 2010' format 
} 

$dates = array_unique($dates);      
for ($i = 0; $i < sizeOf($dates); $i++) { 
    echo('<a href="#">'.$dates[$i].'</a><br />'); 
} 

我在做類似的事情,兩個人字段做工精細,但由於某種原因,這構成了一個$日期數組,它是正確的長度(即:4唯一的日期,數組是4),但只有第一個$日期元素有任何信息。輸出看起來是這樣的:

<a href="#">Mon Oct 3 2010</a><br /> 
<a href="#"></a><br /> 
<a href="#"></a><br /> 
<a href="#"></a><br /> 

當我不使用array_unique,只是測試值檢查,如果一切都得到正確加載和解析,數組只是因爲它應該是(「星期一2010年10月3日」 ,2010年10月3日星期一,2010年10月3日星期一,2010年10月4日星期一,2010年10月5日星期一,2010年10月5日星期一,2010年10月6日星期一)。

任何線索這裏有什麼問題?

+0

echo「Date Array:

".print_r($dates,true)."

」;這看起來像什麼? – 2010-10-07 15:41:40

+0

是實際存儲爲數據庫中字符串字段的日期嗎? (任何理智的數據庫將它作爲DATETIME字段) – Spudley 2010-10-07 15:49:32

+0

@Spudley - 是的不幸...我沒有設置它:( – 2010-10-07 15:51:17

回答

1

將唯一數組賦值給另一個數組變量。並使用foreach

$newarr = array(); 
$newarr = array_unique($dates); 
foreach ($newarr as $date) { 
    echo('<a href="#">'.$date.'</a><br />' . "\n"); 
} 
1

如何處理症狀,而不是治療症狀,請刪除原因。

GROUP BY ff_date_time添加到您的查詢的末尾,或在選擇區域中將DISTINCT()圍繞ff_date_time。那麼你只會在你的sql結果中獲得唯一的日期。

編輯:好吧,假設ff_date_time實際上是一個日期時間字段,那麼爲了忽略一天中的時間,請使用只有日期部分而不是時間部分的GROUP BY DATE(ff_date_time)。如果它不是日期時間字段,並且只是一個字符串,則必須執行子字符串函數或使用其他人的答案。

+0

看起來他修剪了日期時間戳的時間,所以GROUP BY仍然會在同一日期返回多個結果。但是,可能採用ff_date_time的子字符串可能與GROUP BY – 2010-10-07 15:40:47

+0

可能不是預期的結果,因爲在DB中有一部分包含在他的PHP代碼中被刪除的時間 – slosd 2010-10-07 15:42:10

1

使用array_unique之後var_dump($dates)的輸出是什麼?

嘗試的foreach代替for循環:

foreach($dates as $date) { 
    echo('<a href="#">'.$date.'</a><br />'); 
} 
2

array_unique保留鍵,以便你的所得陣列具有元素[0],[4]和[6]。

我建議使用

foreach ($dates as $date) { 
    echo('<a href="#">'.$date.'</a><br />'); 
} 
+0

這個工作完美,我不知道密鑰保存了,我認爲它更像ruby的.uniq !.謝謝! – 2010-10-07 15:51:58

+0

我發現我幾乎沒有在PHP中使用'for' - 我幾乎總是使用'​​foreach' – 2010-10-08 10:15:43

1

我寧願建議你另一種方法。使用內置的日期時間函數。

$all_dates = array(); 
foreach($datetimes as $date) { 
    $all_dates[] = date('D M j Y', strtotime($date)); 
} 

$unique = array_unique($all_dates); 
+0

他的解決方案几乎快了10倍爲什麼調用date和strtotime來完成這麼簡單的任務? – slosd 2010-10-07 15:52:04

+0

@如果你想讓我相信你,slosd爲你的肯定提供了一個基準。作爲第二點,我推薦了我的方法,因爲它更容易維護,而且這是最重要的相當方面。現在可能很容易理解,爆炸函數後,數組的每個值都有哪些值。它嚴格依賴於上下文。稍後返回時,您將不得不進行數據庫查詢以實際查看日期的原始格式,這是重新理解代碼所必需的。 – mhitza 2010-10-07 16:13:00

+0

這將是一個很好的情況來使用註釋來說明數據庫中的數據的外觀;) - 這是我測試的腳本:http://dev.freedig.org/files/date.php - 在我的web服務器上日期/時間版本更慢(15次) – slosd 2010-10-07 16:29:03