2011-04-25 109 views
3

我有以下陣列:按子鍵日期排序多維數組?

[0] => Array 
     (
      [name] => The Name 
      [description] => description 
      [date] => Thur, May 5 @ 7:00 p.m. 
      [rating] => PG 
      [year] => 2011 
     ) 

[1] => Array 
     (
      [name] => Name 2 
      [description] => description 2 
      [date] => Sun, May 8 @ 7:30 p.m. 
      [rating] => 14A 
      [year] => 2011 
     ) 

還有約5-10多個部分。

我最終想要做的就是使用數組的日期部分將這些項目按天分組(即,「所有具有」日期「落入」5月8日「的項目應該被歸類爲這樣)。

任何想法,我怎麼會去這注意,「日期」字段的形式存儲在數據庫 - 這是不是從日期()轉換時間戳;?!或任何

非常感謝

回答

7

創建您自己的排序功能,並使用usort來調用。

例如(不考慮你的時間戳記格式的複雜性):

function date_sort($a, $b) { 
    return strcmp($a['date'], $b['date']); //only doing string comparison 
} 

usort($array, 'date_sort'); 

要完成date_sort,你會莫名其妙地需要將日期轉換爲可比類型。下面是該將它們轉換爲UNIX時間戳的解決方案:

function convert_date($time) { 
    $time = substr($time, strpos($time, ',')+1); 
    $time = str_replace('@', ',', $time); 
    $time = str_replace('.', '', $time); 
    return strtotime($time); 
} 

function date_sort($a, $b) { 
    $a = convert_date($a['date']); 
    $b = convert_date($b['date']); 

    if ($a == $b) { 
    return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 
+0

這完全合理;萬分感謝!這就是說 - 我仍然遇到問題。在上面的例子中,我只有一個數組鍵(I.e.,第一個元素)的數字,但實際上,數組鍵是柱子的子彈(即隨機字符串)。運行usort後,數組鍵被轉換爲數字。有什麼辦法呢? – aendrew 2011-05-04 00:51:55

+1

沒關係! uasort();代替usort();做的伎倆。謝謝,併爲延遲接受這個答案表示歉意! – aendrew 2011-05-04 00:53:30

2

使用@EmilVikström液,用的strtotime作爲比較功能

功能date_sort($ A,$ B){

$ a =的strtotime ($一個[ '日期']); $ b = strtotime($ b ['date']);

return($ a == $ b)? 0:($ a> $ b? - 1:1);

}

usort($ array,'date_sort');

http://fr2.php.net/manual/en/function.strtotime.php應該處理大部分用英文寫成的文本日期。

+0

strtotime不處理這種格式,但我已經用一個將原始格式轉換爲strtotime可以理解的函數更新了我的答案。 – 2011-04-25 10:18:06

0

按日期分組數據,運行這個小環

$sortedArray = array(); 
foreach($dataListing as $data){ 
    //parse your $date field with an reg exp and transform it into integer with format MMDD 
    $sortedArray[$dateIntegerFormated][] = $data; 
} 
ksort($sortedArray); 
$sortedArray = array_values($sortedArray); 

你也可以使用usort爲按時間排序到每個組

0

試試這個

$ arrArray有你有數組規定;

$newArray = array(); 
foreach($arrArray as $key => $value){ 

    $date1 = substr($value['date'], 0, strpos($value['date'],'@')-1); 
    $newArray[$date1][] = $value; 


} 
print_r($newArray);