webentwicklung-frage-antwort-db.com.de

PHP Sortieren Sie ein mehrdimensionales Array nach Element, das Datum enthält

Ich habe ein Array wie:

Array
(
[0] => Array
    (
        [id] => 2
        [type] => comment
        [text] => hey
        [datetime] => 2010-05-15 11:29:45
    )

[1] => Array
    (
        [id] => 3
        [type] => status
        [text] => oi
        [datetime] => 2010-05-26 15:59:53
    )

[2] => Array
    (
        [id] => 4
        [type] => status
        [text] => yeww
        [datetime] => 2010-05-26 16:04:24
    )

)

Kann jemand eine Möglichkeit vorschlagen, dies basierend auf dem datetime-Element zu sortieren/sortieren?

92
Tim

Verwenden Sie usort() und eine benutzerdefinierte Vergleichsfunktion:

function date_compare($a, $b)
{
    $t1 = strtotime($a['datetime']);
    $t2 = strtotime($b['datetime']);
    return $t1 - $t2;
}    
usort($array, 'date_compare');

EDIT: Ihre Daten sind in einem Array von Arrays organisiert. Um diese besser zu unterscheiden, rufen wir die Datensätze der inneren Arrays (Daten) auf, so dass Ihre Daten tatsächlich ein Array von Datensätzen sind.

usort wird jeweils zwei dieser Datensätze an die angegebene Vergleichsfunktion date_compare() übergeben. date_compare extrahiert dann das "datetime"-Feld jedes Datensatzes als UNIX-Zeitmarke (eine Ganzzahl) und gibt die Differenz zurück, so dass 0 das Ergebnis ist, wenn beide Datumsangaben gleich sind, eine positive Zahl, wenn das erste ($a) größer ist oder ein negativer Wert, wenn das zweite Argument ($b) größer ist. usort() verwendet diese Informationen, um das Array zu sortieren.

176
Ferdinand Beyer

Das sollte funktionieren. Ich habe das Datum via strtotime in eine Unix-Zeit umgewandelt.

  foreach ($originalArray as $key => $part) {
       $sort[$key] = strtotime($part['datetime']);
  }
  array_multisort($sort, SORT_DESC, $originalArray);
25
Dave None

Ab PHP7 können Sie den Spaceship-Operator verwenden :

usort($array, function($a, $b) {
  return new DateTime($a['datetime']) <=> new DateTime($b['datetime']);
});
25
Federkun

http://us2.php.net/manual/de/function.array-multisort.php siehe drittes Beispiel:

<?php

$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

?>

fyi, mit einem Unix (Sekunden aus 1970) oder MySQL-Zeitstempel (YmdHis - 20100526014500) wäre für den Parser einfacher, aber ich denke in Ihrem Fall macht es keinen Unterschied.

5
Toby

$array = Array
(
  [0] => Array
   (
    [id] => 2
    [type] => comment
    [text] => hey
    [datetime] => 2010-05-15 11:29:45
   )

 [1] => Array
  (
    [id] => 3
    [type] => status
    [text] => oi
    [datetime] => 2010-05-26 15:59:53
  )

  [2] => Array
   (
    [id] => 4
    [type] => status
    [text] => yeww
    [datetime] => 2010-05-26 16:04:24
   )

   );
   print_r($array);   
   $name = 'datetime';
   usort($array, function ($a, $b) use(&$name){
      return $a[$name] - $b[$name];});

   print_r($array);
4
Ajit Kumar

Array von Datensätzen/assoc_arrays nach angegebenem mysql datetime-Feld und nach Reihenfolge sortiert

function build_sorter($key, $dir='ASC') {
    return function ($a, $b) use ($key, $dir) {
        $t1 = strtotime(is_array($a) ? $a[$key] : $a->$key);
        $t2 = strtotime(is_array($b) ? $b[$key] : $b->$key);
        if ($t1 == $t2) return 0;
        return (strtoupper($dir) == 'ASC' ? ($t1 < $t2) : ($t1 > $t2)) ? -1 : 1;
    };
}


// $sort - key or property name 
// $dir - ASC/DESC sort order or empty
usort($arr, build_sorter($sort, $dir));
4
falko

Sie können dieses Problem einfach mit usort () mit Rückruffunktion lösen. Sie müssen keine benutzerdefinierte Funktion schreiben.

$your_date_field_name = 'datetime';
usort($your_given_array_name, function ($a, $b) use (&$name) {
    return strtotime($a[$name]) - strtotime($b[$name]);
});
1
Faisal

Ich bin auf diesen Beitrag gestoßen, wollte aber bei der Rückgabe der Elemente in meiner Klasse nach Zeit sortieren und bekam einen Fehler.

Also recherchiere ich die php.net-Website und ende damit:

class MyClass {
   public function getItems(){
      usort( $this->items, array("MyClass", "sortByTime") );
      return $this->items;
   }
   public function sortByTime($a, $b){
      return $b["time"] - $a["time"];
   }
}

Sehr nützliche Beispiele finden Sie auf der PHP.net-Website

Mein Array sah so aus:

  'recent' => 
    array
      92 => 
        array
          'id' => string '92' (length=2)
          'quantity' => string '1' (length=1)
          'time' => string '1396514041' (length=10)
      52 => 
        array
          'id' => string '52' (length=2)
          'quantity' => string '8' (length=1)
          'time' => string '1396514838' (length=10)
      22 => 
        array
          'id' => string '22' (length=2)
          'quantity' => string '1' (length=1)
          'time' => string '1396514871' (length=10)
      81 => 
        array
          'id' => string '81' (length=2)
          'quantity' => string '2' (length=1)
          'time' => string '1396514988' (length=10)
1

Für 'd/m/Y' Daten:

usort($array, function ($a, $b, $i = 'datetime') { 
    $t1 = strtotime(str_replace('/', '-', $a[$i]));
    $t2 = strtotime(str_replace('/', '-', $b[$i]));

    return $t1 > $t2;
});

dabei ist $i der Arrayindex

0
Borjão