2012-11-26 57 views
0

在PHP中,我可以按日期排序數組並顯示它們嗎? 類似於asort或usort?按日期排序數組,並保持索引關聯

問題是日期字段也可以包含「UNKNOWN」之類的值。 我想按日期降序打印所有記錄,最後打印UNKNOWNS。 這是我的代碼到目前爲止。

foreach ($MailPieceArr as $key => $val) { 

    $count++; 
    if (($count % 2) == 1) { 
     print "<tr bgcolor='#CCCCCC'>"; 
    } else { 
     print "<tr bgcolor=white>"; 
    } 

    print "<td align=center>".$MailPieceArr[$key]["type"]."</td>"; 
    print "<td align=center>".$MailPieceArr[$key]["id"]."</td>"; 
    print "<td align=center>".$MailPieceArr[$key]["ddate"]."</td>"; 
    print "<td align=center>".$MailPieceArr[$key]["acode"]."</td>"; 

    print "</tr>"; 
} 

這裏是我的陣列看起來像:

print_r($MailPieceArr); 

輸出:

Array 
(
    [0] => Array 
     (
      [type] => First-Class 
      [id] => 77770056 
      [ddate] => 11/26/2012 
      [acode] => 2643 
     ) 

    [1] => Array 
     (
      [type] => First-Class 
      [id] => 77770057 
      [ddate] => 11/26/2012 
      [acode] => 2643 
     ) 

    [2] => Array 
     (
      [type] => First-Class 
      [id] => 77770058 
      [ddate] => 11/21/2012 
      [acode] => 2641 
     ) 

    [3] => Array 
     (
      [type] => First-Class 
      [id] => 77770059 
      [ddate] => 11/21/2012 
      [acode] => 2641 
     ) 

    [4] => Array 
     (
      [type] => First-Class 
      [id] => 77770042 
      [ddate] => 10/29/2012 
      [acode] => 2623 
     ) 

    [5] => Array 
     (
      [type] => First-Class 
      [id] => 77770041 
      [ddate] => 10/29/2012 
      [acode] => 2623 
     ) 

    [6] => Array 
     (
      [type] => RR 
      [id] => 88880001 
      [ddate] => 10/29/2012 
      [acode] => 2621 
     ) 

    [7] => Array 
     (
      [type] => First-Class 
      [id] => 77770043 
      [ddate] => 10/17/2012 
      [acode] => 2625 
     ) 

    [8] => Array 
     (
      [type] => First-Class 
      [id] => 77770044 
      [ddate] => 10/17/2012 
      [acode] => 2625 
     ) 

    [9] => Array 
     (
      [type] => RR 
      [id] => 88880005 
      [ddate] => 10/17/2012 
      [acode] => 2619 
     ) 

    [10] => Array 
     (
      [type] => IMB 
      [id] => 0001101111111111110011111111111 
      [ddate] => UNKNOWN 
      [acode] => 2643 
     ) 

) 

回答

0

您可以轉換日期UNIX timestampt和他們的將是更容易比較。

1

在排序函數中使用strtotime,不僅比較時間戳比較容易,而且它在無效的日期格式上也返回false。

function date_sort($a, $b) 
{ 
    $t1 = strtotime($a['ddate']); 
    $t2 = strtotime($b['ddate']); 

    if($t1 == false || $t2 == false) 
     return 1; 

    return $t2 - $t1; 
}  
usort($array, 'date_sort'); 

,可以幫助你生成類似this example

0

使用usort()將讓你使用一個完全自定義的比較函數對數組進行排序:

<?php 
date_default_timezone_set('UTC'); 

$array = array(
    array(
     'type' => 'First-Class', 
     'id' => 7770057, 
     'ddate' => '2012/11/26', 
     'acode' => 2643 
    ), 
    array(
     'type' => 'First-Class', 
     'id' => 7770058, 
     'ddate' => '2012/11/21', 
     'acode' => 2643 
    ), 
    array(
     'type' => 'First-Class', 
     'id' => 7770059, 
     'ddate' => 'UNKNOWN', 
     'acode' => 2643 
    ), 
    array(
     'type' => 'First-Class', 
     'id' => 7770060, 
     'ddate' => 'UNKNOWN', 
     'acode' => 2643 
    ), 
    array(
     'type' => 'First-Class', 
     'id' => 7770061, 
     'ddate' => '2012/11/30', 
     'acode' => 2643 
    ), 
); 


echo 'Before:'.PHP_EOL; 
foreach($array as $item){ 
    echo $item['id'].': '.$item['ddate'].PHP_EOL; 
} 

usort($array, function($a, $b){ 
    if($a['ddate'] == 'UNKNOWN'){ 
      // Place UNKNOWN at end 
     return 1; 
    } 

    if($a['ddate'] == $b['ddate']){ 
      // Dates are the same 
     return 0; 
    } 
    return (strtotime($a['ddate']) > strtotime($b['ddate'])) ? -1 : 1; 
}); 

echo 'After:'.PHP_EOL; 
foreach($array as $item){ 
    echo $item['id'].': '.$item['ddate'].PHP_EOL; 
} 

您應該考慮使用PHP的DateTime class用於存儲你的約會對象,但是。使用字符串可能是不明確的 - 例如,2012年12月11日11月11日或11月12日?