2017-01-27 1 views
1

나는 usort의 예상치 못한 결과가 있습니다. INPHP 정렬 타임 스탬프 배열

$ccpmail[] = 
    array(
      "mail_id"=>$evemailheader["mail_id"], 
      "is_read"=>$evemailheader['is_read'],           
      "fromid"=>$evemailheader['from'], 
      "fromname"=>$character_names[get_character_name($evemailheader['from'], $character_names)]['character_name'], 
      "subject"=>$evemailheader['subject'], 
      "labels"=>array("EVE Online"), 
      'datestamp'=>strtotime($evemailheader['timestamp']), 
      'date'=>$date 
     ); 

$email[] = 
    array(
     "mail_id"=>$mailid, 
     "is_read"=>$is_read,            
     "fromid"=>$message_parsed->getHeaderValue('from'), 
     "fromname"=>$message_parsed->getHeader('from')->getPersonName(), 
     "subject"=>$message_parsed->getHeaderValue('subject'), 
     "labels"=>array("E-mail"), 
     'datestamp'=>strtotime($message_parsed->getHeaderValue('date')), 
     'date'=>$date->format('Y-m-d H:i:s') 
    ); 


$allmail = array_merge($ccpmail, $email); 

function sortByOrder($a, $b) { 
return $a['datestamp'] < $b['datestamp']; 
} 

usort($allmail, 'sortByOrder'); 
var_dump($allmail); 

결과 :

array(133) { 
[0]=> 
array(8) { 
    ["mail_id"]=> 
    string(32) "bcfc5f6b0365738e58c99e0501b37210" 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    string(22) "EMAIL" 
    ["fromname"]=> 
    string(12) "NAME" 
    ["subject"]=> 
    string(4) "tset" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(6) "E-mail" 
    } 
    ["datestamp"]=> 
    int(1485509147) 
    ["date"]=> 
    string(19) "2017-01-27 09:25:47" 
} 
[1]=> 
array(8) { 
    ["mail_id"]=> 
    string(32) "317c556f35213548598f0bb838a237c1" 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    string(22) "EMAIL" 
    ["fromname"]=> 
    string(12) "NAME" 
    ["subject"]=> 
    string(5) "etest" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(6) "E-mail" 
    } 
    ["datestamp"]=> 
    int(1485509066) 
    ["date"]=> 
    string(19) "2017-01-27 09:24:26" 
} 
[2]=> 
array(8) { 
    ["mail_id"]=> 
    int(364172046) 
    ["is_read"]=> 
    bool(false) 
    ["fromid"]=> 
    int(90766569) 
    ["fromname"]=> 
    string(13) "NAME" 
    ["subject"]=> 
    string(2) "hi" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(10) "EVE Online" 
    } 
    ["datestamp"]=> 
    int(1485507000) 
    ["date"]=> 
    object(DateTime)#3 (3) { 
     ["date"]=> 
     string(26) "2017-01-27 08:50:00.000000" 
     ["timezone_type"]=> 
     int(2) 
     ["timezone"]=> 
     string(1) "Z" 
    } 
} 
[3]=> 
array(8) { 
    ["mail_id"]=> 
    int(364160956) 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    int(793110520) 
    ["fromname"]=> 
    string(10) "NAME" 
    ["subject"]=> 
    string(30) "theres no brakes on this train" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(10) "EVE Online" 
    } 
    ["datestamp"]=> 
    int(1485455100) 
    ["date"]=> 
    object(DateTime)#7 (3) { 
     ["date"]=> 
     string(26) "2017-01-26 18:25:00.000000" 
     ["timezone_type"]=> 
     int(2) 
     ["timezone"]=> 
     string(1) "Z" 
    } 
} 
[4]=> 
array(8) { 
    ["mail_id"]=> 
    int(364160959) 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    int(793110520) 
    ["fromname"]=> 
    string(10) "NAME" 
    ["subject"]=> 
    string(10) "safe word?" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(10) "EVE Online" 
    } 
    ["datestamp"]=> 
    int(1485455100) 
    ["date"]=> 
    object(DateTime)#5 (3) { 
     ["date"]=> 
     string(26) "2017-01-26 18:25:00.000000" 
     ["timezone_type"]=> 
     int(2) 
     ["timezone"]=> 
     string(1) "Z" 
    } 
} 
[5]=> 
array(8) { 
    ["mail_id"]=> 
    int(364160957) 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    int(1228369447) 
    ["fromname"]=> 
    string(7) "NAME" 
    ["subject"]=> 
    string(4) "spam" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(10) "EVE Online" 
    } 
    ["datestamp"]=> 
    int(1485455100) 
    ["date"]=> 
    object(DateTime)#6 (3) { 
     ["date"]=> 
     string(26) "2017-01-26 18:25:00.000000" 
     ["timezone_type"]=> 
     int(2) 
     ["timezone"]=> 
     string(1) "Z" 
    } 
} 
[6]=> 
array(8) { 
    ["mail_id"]=> 
    int(364160934) 
    ["is_read"]=> 
    bool(true) 
    ["fromid"]=> 
    int(94312752) 
    ["fromname"]=> 
    string(19) "NAME" 
    ["subject"]=> 
    string(4) "spam" 
    ["labels"]=> 
    array(1) { 
     [0]=> 
     string(10) "EVE Online" 
    } 
    ["datestamp"]=> 
    int(1485455040) 
    ["date"]=> 
    object(DateTime)#11 (3) { 
     ["date"]=> 
     string(26) "2017-01-26 18:24:00.000000" 
     ["timezone_type"]=> 
     int(2) 
     ["timezone"]=> 
     string(1) "Z" 
    } 
} 

배열 내가 그것을 할 방법처럼 정렬되지 않습니다 당신이 볼 수 있듯이. 나는 가장 낮은 타임 스탬프를 원한다. 누구든지 나를 도울 수 있습니까?

+1

'return $ a [ 'datestamp']> $ b [ 'datestamp'];'? –

+0

작동하지 않았습니다 ... array_reverse()와 똑같이 정렬 된 배열 –

답변

0

비교 기능을 제대로 정렬하려면 0보다 크거나 작은 정수를 반환해야합니다. (See the definition of value_compare_func here.)이 표현 :

return $a['datestamp'] < $b['datestamp']; 

은 올바른 값입니다 어느 것도 true 또는 false (1 또는 0) 나중에 사람 (-1) 전에 이전 타임 스탬프를 정렬 돌아갑니다.

비교를 한 번 더 추가하여 올바르게 정렬 할 수 있습니다. 당신이 PHP 7을 사용하는 경우

다른 답변에서 언급 한 바와 같이
function sortByOrder($a, $b) { 
    if ($a['datestamp'] < $b['datestamp']) return -1; // return -1 if $a is earlier 
    return $a['datestamp'] > $b['datestamp']; // return 1 if $a is later, or 0 if equal 
} 

는, 운영자는 하나 개의 문장으로이 작업을 수행하게됩니다 (<=>)가있다. 당신이 PHP7 이상을 사용하는 경우

+0

불행하게도 –

+0

@ S.R과 똑같은 결과가 나타납니다. 그것은 나를 위해 작동합니다 : https://3v4l.org/AsbCB –

+0

두 번 확인하고 작동 확인했습니다 –

1

, 당신과 같이, 우주선 연산자를 사용할 수 있습니다 당신이 원하는 것처럼

function sortByOrder($a, $b) { 
    return $a['datestamp'] <=> $b['datestamp']; 
} 

이 그것을 정렬합니다. PHP7 이상을 사용하지 않는 경우, if 문이 더 높거나 낮거나 같은지 확인하기 위해 if 문을 만들어야합니다.

+0

이 테스트를 위해 PHP7을 실행하지 않았으므로 업그레이드를 고려할 것입니다 ... –