2013-07-16 26 views
1

我有個工作日(見下文),我想排序爲「週一至週二,週三,週四,週五,週六 - 週日」的數組。PHP排序工作日和月年通過陣列的客戶訂單

"Sun"=>59 
"Sat"=>41 
"Fri"=>21 
"Thu"=>11 
"Wed"=>14 
"Tue"=>19 
"Mon"=>31 

我嘗試以下代碼,但它似乎不正常工作,結果是有序陣列上方粘貼,即不按順序我想的那樣。

function orderbyweekday($a, $b) { 

    if (strcmp($a, "Mon") == 0) 
     $a = 0; 
    else if (strcmp($a, "Tue") == 0) 
     $a = 1;  
    else if (strcmp($a, "Wed") == 0) 
     $a = 2; 
    else if (strcmp($a, "Thu") == 0) 
     $a = 3; 
    else if (strcmp($a, "Fri") == 0) 
     $a = 4; 
    else if (strcmp($a, "Sat") == 0) 
     $a = 5; 
    else if (strcmp($a, "Sun") == 0) 
     $a = 6;  

    if (strcmp($b, "Mon") == 0) 
     $b = 0; 
    else if (strcmp($b, "Tue") == 0) 
     $b = 1;  
    else if (strcmp($b, "Wed") == 0) 
     $b = 2; 
    else if (strcmp($b, "Thu") == 0) 
     $b = 3; 
    else if (strcmp($b, "Fri") == 0) 
     $b = 4; 
    else if (strcmp($b, "Sat") == 0) 
     $b = 5; 
    else if (strcmp($b, "Sun") == 0) 
     $b = 6;  

    // if same day, return 0 
    if ($a == $b) { 
     return 0; 
    } 

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

uksort($movies_per_day, "orderbyweekday"); 

我還要做類似的事情與月年陣列(例如「2010年6月」 => 10「 2009年5月」 => 111,等等),但是一旦我得到這個對它應該更容易。

非常感謝。

回答

1

你可以試試這個。

function weekdaySort($a, $b){ 
     $weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun"); 
     return array_search($a, $weekdays) - array_search($b, $weekdays); 
} 

uksort($movies_per_day, "weekdaySort"); 

或者如果您使用的是PHP 5.3或更高版本,則可以使用閉包;

$weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun"); 
uksort($movies_per_day, function($a, $b) use ($weekdays) {return array_search($a, $weekdays) - array_search($b, $weekdays);}); 

這將避免重新創建$weekdays陣列與每個迭代。

+0

大,它的作品! 但我不明白我做錯了什麼,但從來不知道。 謝謝! – MDT

+0

我認爲原來的錯誤可以通過改變'return($ a> $ b)來解決? -1:1;'返回'($ a <$ b)? -1:1;' – Orangepill

+0

隨時接受答案,如果這爲你解決。 – Orangepill

0

我會建議改變數組鍵的東西更多計算機可讀(和排序),所以使用數字作爲重點:

$days = array(6=>59,5=>41,4=>21,3=>11,2=>14,1=>19,0=>31); 

然後,您可以通過向天排序:

ksort($days); 

至少在這麼困難的密鑰爲「2010年6月」這幾乎是不可能的排序您的陣列。 您可以使用像$key = year*12+month;這樣的鍵具有可排序的索引。如果您在1月份使用0,則「2010年6月」可寫爲24125(2010 * 12 + 5)。

還是用了一個月的第一天的時間戳:

$key = mktime(0,0,0,6,1,2010); 

,如果你想有一個每日報告有一天這是更靈活。

0

有點晚了接受,但一個好處是,這將與其他語言的天工作,因爲它使用PHP的日期/時間處理

$days = array(
    "Sun"=>59, 
    "Sat"=>41, 
    "Fri"=>21, 
    "Thu"=>11, 
    "Wed"=>14, 
    "Tue"=>19, 
    "Mon"=>31, 
); 
uksort($days, function($a, $b) { 

    $c = date_diff(new DateTime('@' . strtotime($a, strtotime('Mon', 0))), new DateTime('@' . strtotime($b, strtotime('Mon', 0)))); 

    return $c->invert ? 1 : -1; 
}); 

這似乎對於這樣一個簡單的任務過於複雜,我肯定有更好的辦法!

0

這種方法需要PHP> 5.3:

$arr = array("Sun"=>59, "Thu"=>11, "Sat"=>41, "Fri"=>21, "Tue"=>19, "Wed"=>14, "Mon"=>31); 
$ord = array_flip(array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')); 
uksort($arr, function ($a, $b) use($ord){ 
    return $ord[$a] - $ord[$b]; 
}); 
var_dump($arr); 
相關問題