2012-11-26 2 views
0

PHP에서 배열을 날짜순으로 정렬하고 표시 할 수있는 방법이 있습니까? asort 또는 usort와 비슷합니까?날짜별로 배열을 정렬하고 인덱스 연결을 유지하십시오.

문제는 datefield에 "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

당신은 유닉스 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과 같은 것을 생성하는 데 도움이 될 수 있습니다. 당신은 완전히 사용자 정의 비교 함수를 사용하여 배열을 정렬 할 것이다 usort()를 사용

0

는 :

<?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 날짜 객체를 저장하기위한 사용을 고려해야합니다. 문자열 사용은 모호 할 수 있습니다. 예를 들어, 11/12/2012, 11 월 11 일 또는 11 월 12 일입니까?

관련 문제