У меня есть массив, такой как:
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?
Используйте 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 вы можете использовать оператор Spaceship :
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 (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);
Сортировка массива записей / ассоциаций по заданному полю 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]); });