В PHP сортировка многомерного массива с помощью элемента, содержащего дату
У меня есть массив, например:
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
)
)
может ли кто-нибудь предложить способ сортировки/упорядочения этого на основе элемента datetime?
9 ответов:
использовать
usort()
и пользовательская функция сравнения:function date_compare($a, $b) { $t1 = strtotime($a['datetime']); $t2 = strtotime($b['datetime']); return $t1 - $t2; } usort($array, 'date_compare');
EDIT: ваши данные организованы в массив массивов. Чтобы лучше различать их, давайте вызовем внутренние массивы (данные) записей, так что ваши данные действительно массив записей.
usort
передаст две из этих записей в заданную функцию сравненияdate_compare()
одновременно.date_compare
затем извлекает"datetime"
поле каждой записи как метка времени UNIX (целое число) и возвращает разницу, так что результат будет0
если обе даты равны, положительное число, если первая ($a
) больше или отрицательное значение, если второй аргумент ($b
) больше.usort()
использует эту информацию для сортировки массива.
Это должно работать. Я преобразовал даты в Unix время с помощью использования функции strtotime.
foreach ($originalArray as $key => $part) { $sort[$key] = strtotime($part['datetime']); } array_multisort($sort, SORT_DESC, $originalArray);
из php7 вы можете использовать оператор космического корабля:
usort($array, function($a, $b) { return new DateTime($a['datetime']) <=> new DateTime($b['datetime']); });
http://us2.php.net/manual/en/function.array-multisort.php см. третий пример:
<?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, используя unix (секунды с 1970 года) или mysql timestamp (YmdHis - 20100526014500) было бы проще для парсера, но я думаю, что в вашем случае это не имеет никакого значения.
$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);
сортировка массива записей / assoc_arrays по заданному полю MySQL datetime и по порядку:
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));
я наткнулся на этот пост, но я хотел отсортировать по времени при возврате элементов внутри моего класса, и я получил ошибку.
поэтому я исследую php.net сайт и в конечном итоге делает это:
class MyClass { public function getItems(){ usort( $this->items, array("MyClass", "sortByTime") ); return $this->items; } public function sortByTime($a, $b){ return $b["time"] - $a["time"]; } }
вы можете найти очень полезные примеры в PHP.net сайт
мой массив выглядел так:
'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)
вы можете просто решить эту проблему, используя usort() С функцией обратного вызова. Нет необходимости писать какие-либо пользовательские функции.
$your_date_field_name = 'datetime'; usort($your_given_array_name, function ($a, $b) use (&$name) { return strtotime($a[$name]) - strtotime($b[$name]); });