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?
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.
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);
Ab PHP7 können Sie den Spaceship-Operator verwenden :
usort($array, function($a, $b) {
return new DateTime($a['datetime']) <=> new DateTime($b['datetime']);
});
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.
$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);
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));
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]);
});
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)
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