1
votes

Comment trier des tableaux à deux dimensions par clé en PHP

J'ai un tableau à 2 dimensions sous cette forme:

usort(
    $my_array,
    function($a, $b) {
        return strcmp($a['date'], $b['date']);
    }
    );

Tout ce que j'essaye de faire est de le trier de telle sorte que le tableau avec la date 10/05 / 2017 vient avant les autres.

J'ai essayé ce qui suit:

$my_array = array(
    array("date" => "10/04/2019"),
    array("date" => "10/05/2017")
    ...
)

Cela ne semble pas fonctionner.

J'ai encore des dates plus tardives avant les précédentes.

C'est un peu plus compliqué que ce que j'ai démontré, mais je pense que c'est le principe de base. S'il y a quelque chose qui ne va pas avec l'exemple que j'ai donné, alors cela pourrait expliquer les choses.

Modifier - Corrigé en fonction de la bonne réponse et d'autres commentaires. Je comparais des chaînes et non des dates. L'emballage de strtotime a fait en sorte que la comparaison soit entre les dates. J'ai également changé le format des dates en Y / m / d (format MySQL) et cela fonctionne exactement comme prévu. Merci encore à tous ceux qui ont contribué.


6 commentaires

Vous comparez des chaînes, pas des dates. 4 est avant 5 .


Vos chaînes de date doivent être au format année / mois / jour pour que cette comparaison alphabétique fonctionne correctement


10 est le mois ou le jour?


Vous pouvez modifier la structure de votre tableau. $ my_array = array ("date" => array ("10/04/2019", "10/05/2017"));


@Jonnix J'ai envisagé cela plus tôt, mais pour une raison quelconque, je ne m'y suis pas engagé. Ca a du sens.


@RahulMeshram 10 serait le jour.


4 Réponses :


4
votes

Comme vous l'avez dit, vous avez le format d / m / Y qui n'est pas valide selon la documentation PHP, vous devez le convertir en d-m-Y .
Vous pouvez comparer les dates comme ci-dessous,

usort($my_array, function ($a, $b) {
    $aDate = strtotime(str_replace("/", "-", $a['date']));
    $bDate = strtotime(str_replace("/", "-", $b['date']));
    return $aDate - $bDate;
});

Remarque: les dates au format m / j / a ou j-m-y ne sont pas ambiguës en regardant au séparateur entre les différents composants: si le séparateur est un barre oblique (/), alors l'américain m / j / y est supposé; alors que si le le séparateur est un tiret (-) ou un point (.), puis le format européen j-m-y est supposé. Si, toutefois, l'année est indiquée sous un format à deux chiffres et le séparateur est un tiret (-, la chaîne de date est analysée comme y-m-d.

Source lien .

Démo .


5 commentaires

La fonction de comparaison est censée renvoyer un nombre, pas un booléen.


J'ai fait des changements. Jetez un coup d'oeil s'il vous plait.


Il dit dans un commentaire que les dates sont au format jj / mm / aaaa . strtotime () les analysera comme mm / jj / aaaa .


J'ai remplacé / par - . Vous pouvez actualiser la page pour les modifications reflétées.


Une combinaison des informations que j'ai apprises de ce commentaire et de certains des commentaires ci-dessous suggérant que je compare des chaînes et non une date (que j'ai votée pour) m'a donné la réponse ultime. Je marque donc celle-ci comme la bonne réponse pour la source, la citation, la démo et la réponse concise. Merci a tous.



4
votes

il serait préférable pour vous de comparer des horodatages plutôt que des chaînes de date

$my_array = array(
    array("date" => "10/04/2019"),
    array("date" => "10/05/2017")
);

usort($my_array, function ($a, $b) {
    return strtotime($a['date']) <=> strtotime($b['date']);
});

print_r($my_array);

demo https://3v4l.org/KGAIk


1 commentaires

Je n'ai pas accès à l'opérateur du vaisseau spatial.



0
votes

Changez votre format de date comme ceci j-m-Y. Après avoir converti votre date, votre fonction fonctionnera correctement.

Voir ci-dessous le code de travail

    $my_array = array(
    array("date" => "11-04-2019"),
    array("date" => "12-05-2017"),
    array("date" => "13-05-2018"),
    array("date" => "14-05-2016"));
usort(
    $my_array,
    function ($a, $b) {
        return strtotime($a['date']) - strtotime($b['date']);
    });
print_r($my_array);


0 commentaires

1
votes

Si vous changez votre format de date en AAAA / MM / JJ, votre fonction devrait commencer à fonctionner correctement.


0 commentaires