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?

Related of "PHP Сортировка многомерного массива по элементу, содержащему дату"

Используйте 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]); });