web-dev-qa-db-fra.com

trier le tableau en fonction de la dateTime en php

Array
        (
            [0] => Array
                (
                    [dateTime] => 2011-10-18 0:0:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )

            [1] => Array
                (
                    [dateTime] => 2011-10-18 0:15:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )


            [2] => Array
                (
                    [dateTime] => 2011-10-18 00:14:00
                    [chanl1] => 20.7
                    [chanl2] => 33.8
                    [chanl3] => 
                )

            [3] => Array
                (
                    [dateTime] => 2011-10-18 00:29:00
                    [chanl1] => 20.6
                    [chanl2] => 33.9
                    [chanl3] => 
                )

Je veux trier le tableau ci-dessus basé sur le [dateTime], la sortie finale devrait être:

Array
        (
            [0] => Array
                (
                    [dateTime] => 2011-10-18 0:0:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )

            [1] => Array
                (
                    [dateTime] => 2011-10-18 00:14:00
                    [chanl1] => 20.7
                    [chanl2] => 33.8
                    [chanl3] => 
                )

            [2] => Array
                (
                    [dateTime] => 2011-10-18 0:15:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )            

            [3] => Array
                (
                    [dateTime] => 2011-10-18 00:29:00
                    [chanl1] => 20.6
                    [chanl2] => 33.9
                    [chanl3] => 
                )

Est-ce que quelqu'un sait comment le faire? Merci!

18
Acubi

Utilisez la fonction usort() avec un comparateur personnalisé:

$arr = array(...);

usort($arr, function($a, $b) {
  $ad = new DateTime($a['dateTime']);
  $bd = new DateTime($b['dateTime']);

  if ($ad == $bd) {
    return 0;
  }

  return $ad < $bd ? -1 : 1;
});

DateTime class a surchargé les opérateurs de comparaison (<, >, ==).

44
Crozin

Utiliser uasort() avec un rappel de tri personnalisé devrait le faire:

function cmp($a, $b) {
  if ($a['dateTime'] == $b['dateTime']) {
    return 0;
  }

  return ($a['dateTime'] < $b['dateTime']) ? -1 : 1;
}

uasort($arr, 'cmp');

uasort() conserve les clés de votre tableau, vous pouvez utiliser usort() à la place si cela n’a pas besoin.

11
Clive

Pour les performances, cette méthode utilisant array_multisort est très efficient :

$ord = array();
foreach ($array as $key => $value){
    $ord[] = strtotime($value['dateTime']);
}
array_multisort($ord, SORT_ASC, $array);
print_r($array);
8
User4407

Pour les tableaux et objets php, cet exemple est utile pour trier ...

Pour date-heure décroissante:

usort($response_data['callback'], function($a, $b) {
   return strcasecmp(strtotime($b->view_date), strtotime($a->view_date));
});

Pour date-heure ascendante:

usort($response_data['callback'], function($a, $b) {
   return strtotime($a->view_date) - strtotime($b->view_date);
});
2
Mani

Utilisez array_multisort:

 <?php
        $myarray=array(
                    0 => array
                        (
                            'dateTime' => '2011-10-18 00:0:00',
                            'chanl1' => '20.7',
                            'chanl2' => '45.4',
                            'chanl3' => '',
                        ),

                    1 => array
                        (
                            'dateTime' => '2011-10-18 00:15:00',
                            'chanl1' => '20.7',
                            'chanl2' => '45.4',
                            'chanl3' => '',
                        ),
                  2 => array
                        (
                            'dateTime' => '2011-10-18 00:14:00',
                            'chanl1' => '20.7',
                            'chanl2' => '33.8',
                            'chanl3' => '',
                        ),

                    3 => array
                        (
                            'dateTime' => '2011-10-18 00:29:00',
                            'chanl1' => '20.6',
                            'chanl2' => '33.9',
                            'chanl3' => ''
                        ));

            foreach($myarray as $c=>$key) {
                    $dateTime[] = $key['dateTime'];
                $chanl1[] = $key['chanl1'];
                    $chanl2[] = $key['chanl2'];
                    $chanl3[] = $key['chanl3'];
            }

        array_multisort($dateTime,SORT_ASC,SORT_STRING,$myarray);   
        print_r($myarray);
2
user319198

Tri simple pour les objets DateTime avec l'opérateur de vaisseau spatial:

$list = [
    new DateTime('yesterday'),
    new DateTime('today'),
    new DateTime('1 week ago'),
];

uasort($list, function ($a, $b) {
    return $a <=> $b;
});

var_dump($list);
0
Stefan Pöltl