2017-01-27 2 views
1

J'ai un résultat inattendu d'usort.php sorting timestamp array

$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); 

RÉSULTATS:

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" 
    } 
} 

Comme vous pouvez le voir le tableau ne sont pas triées comme la façon dont je le veux. Je veux l'horodatage le plus bas en haut. Quelqu'un peut m'aider?

+1

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

+0

N'a pas fonctionné ... le tableau trié tout comme array_reverse() –

Répondre

0

Votre fonction de comparaison doit renvoyer un nombre entier supérieur, inférieur ou égal à zéro afin de trier correctement. (See the definition of value_compare_func here.) Cette expression:

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

ne retourneront true ou false (1 ou 0), ni qui est la valeur correcte pour trier plus tôt horodatages avant les ultérieures (-1).

Vous pouvez ajouter une comparaison supplémentaire de sorte que ce seront les valeurs nécessaires pour trier correctement.

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 
} 

Comme il est indiqué dans l'autre réponse, si vous utilisez PHP 7 il y a un opérateur (<=>) qui vous permettra de le faire avec une déclaration.

+0

Cela a exactement le même résultat malheureusement –

+0

@ S.R. Cela fonctionne pour moi: https://3v4l.org/AsbCB –

+0

J'ai vérifié les choses et a confirmé le travail –

1

Si vous utilisez PHP7 ou version ultérieure, vous pouvez utiliser l'opérateur de vaisseau spatial, comme ceci:

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

Cela triera comme vous voulez. Si vous n'utilisez pas PHP7 ou supérieur, vous devrez faire des instructions if pour voir si elle est supérieure, inférieure ou égale.

+0

Je n'ai pas PHP7 en cours d'exécution pour tester cela, je vais envisager de mettre à jour ... –