У меня есть массив, и я хочу сортировать его по дате. Я не могу правильно сортировать его по дате в порядке убывания. Пожалуйста помоги.
Array ( [1] => Array ( [1] => 11/05/2013 [2] => Executive Planning Day ) [2] => Array ( [1] => 13/06/2013 [2] => Middle Leaders Planning Day ) [3] => Array ( [1] => 12/07/2013 [2] => New Staff Induction Day ) [4] => Array ( [1] => 13/04/2013 [2] => Staff Conference Day No. 1 ) [5] => Array ( [1] => 14/04/2013 [2] => Staff Conference Day No. 2 ) [6] => Array ( [1] => 15/02/2013 [2] => Staff Conference Day No. 3 ) [7] => Array ( [1] => 16/03/2013 [2] => Australia Day ) )
Попробуйте это
function sortFunction( $a, $b ) { return strtotime($a[1]) - strtotime($b[1]); } usort($data, "sortFunction"); //Here You can use asort($data,"sortFunction")
или вы можете попробовать подробно (как его просто предложение)
function sortFunction($a,$b) if ($a[1] == $b[1]) return 0; return strtotime($a[1]) - strtotime($b[1]); } usort($data,"sortFunction");
Поскольку strtotime не подчиняется d / m / Y, попробуйте сделать это
$orderByDate = $my2 = array(); foreach($data as $key=>$row) { $my2 = explode('/',$row[1]); $my_date2 = $my2[1].'/'.$my2[0].'/'.$my2[2]; $orderByDate[$key] = strtotime($my_date2); } array_multisort($orderByDate, SORT_DESC, $data);
Используйте usort()
:
function cmp($a, $b) { if ($a[1] == $b[1]) return 0; return (strtotime($a[1]) < strtotime($b[1])) ? 1 : -1; } usort($data, "cmp");
Не совсем доволен всеми ответами здесь, поэтому я подумал, что хочу упомянуть, что если вы хотите отсортировать ассоциативный массив, сохраняющий ключи, тогда вы должны использовать uasort
а не usort
. Вы также можете анализировать дату из любого формата, который вам нравится, с помощью библиотеки DateTime
которая также включает некоторые предопределенные константы для некоторых стандартных форматов.
uasort($array, function($a, $b){ $format = 'd/m/Y'; $ascending = false; $zone = new DateTimeZone('UTC'); $d1 = DateTime::createFromFormat($format, $a[1], $zone)->getTimestamp(); $d2 = DateTime::createFromFormat($format, $b[1], $zone)->getTimestamp(); return $ascending ? ($d1 - $d2) : ($d2 - $d1); });
демонстрация
Я бы построил массив для заказа.
$ordered = array(); foreach ($planning as $event) { $ordered[$event['date']] = $event; } ksort($ordered);
Использование usort (Сортировка массива по значениям с использованием пользовательской функции сравнения).
usort($array, function($a1, $a2) { $value1 = strtotime($a1['date']); $value2 = strtotime($a2['date']); return $value1 - $value2; });
Я провел ночь, работая над тем, как это сделать для моей собственной аналогичной проблемы. Сортировка ассоциативного массива по дате ключа в этом массиве.
И usort, и uasort требуют функцию сортировки, которую вы должны написать и передать как второй параметр. Функция сортировки используется usort и uasort для сравнения каждого элемента в массиве и сохранения результата в виде $ yourArray
function sortFunction( $a, $b ) { return strtotime($a[1]) - strtotime($b[1]); } uasort($yourArray, "sortFunction");
Решение @ Gautam3164 почти идеально. Вам нужно изменить формат дат. Я бы сказал:
function sortFunction( $a, $b ) { return strtotime(str_replace('/', '-',$a[1])) - strtotime(str_replace('/', '-',$b[1])); } usort($data, "sortFunction"); //Here You can use asort($data,"sortFunction")
10.11.1987 -> 10 ноября 1987 г. 11-10-1987 -> 11 октября 1987 г.
$sortdate = array( '17/08/2015', '02/01/2017', '05/02/2014' ); function sortFunction($a, $b) { $datea = strtotime(str_replace('/', '-', $a)); $dateb = strtotime(str_replace('/', '-', $b)); if ($datea == $dateb) { return 0; } return ($datea < $dateb) ? -1 : 1; } usort($sortdate, "sortFunction"); echo "<pre>"; var_dump($sortdate);
Я прыгнул сюда для сортировки ассоциативного массива и нашел эту удивительную функцию на http://php.net/manual/en/function.sort.php . Эта функция очень динамична, сортируя по возрастанию и убыванию с указанным ключом.
Простая функция для сортировки массива по определенному ключу. Поддерживает ассоциацию индексов.
<?php function array_sort($array, $on, $order=SORT_ASC) { $new_array = array(); $sortable_array = array(); if (count($array) > 0) { foreach ($array as $k => $v) { if (is_array($v)) { foreach ($v as $k2 => $v2) { if ($k2 == $on) { $sortable_array[$k] = $v2; } } } else { $sortable_array[$k] = $v; } } switch ($order) { case SORT_ASC: asort($sortable_array); break; case SORT_DESC: arsort($sortable_array); break; } foreach ($sortable_array as $k => $v) { $new_array[$k] = $array[$k]; } } return $new_array; } $people = array( 12345 => array( 'id' => 12345, 'first_name' => 'Joe', 'surname' => 'Bloggs', 'age' => 23, 'sex' => 'm' ), 12346 => array( 'id' => 12346, 'first_name' => 'Adam', 'surname' => 'Smith', 'age' => 18, 'sex' => 'm' ), 12347 => array( 'id' => 12347, 'first_name' => 'Amy', 'surname' => 'Jones', 'age' => 21, 'sex' => 'f' ) ); print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname