PHP Сортировка многомерного массива по элементу, содержащему дату - PullRequest
99 голосов
/ 26 мая 2010

У меня есть массив, такой как:

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 ]

185 голосов
/ 26 мая 2010

Использование usort() и пользовательская функция сравнения:

function date_compare($a, $b)
{
    $t1 = strtotime($a['datetime']);
    $t2 = strtotime($b['datetime']);
    return $t1 - $t2;
}    
usort($array, 'date_compare');

РЕДАКТИРОВАТЬ : Ваши данные организованы в массив массивов. Чтобы лучше их различать, давайте назовем записи внутренних массивов (данных), чтобы ваши данные действительно представляли собой массив записей.

usort будет одновременно передавать две из этих записей в данную функцию сравнения date_compare(). date_compare затем извлекает поле "datetime" каждой записи как метку времени UNIX (целое число) и возвращает разницу, так что результат будет 0, если обе даты равны, положительное число, если первая ( $a) больше или отрицательное значение, если второй аргумент ($b) больше. usort() использует эту информацию для сортировки массива.

31 голосов
/ 07 ноября 2016

С php7 вы можете использовать оператор Spaceship :

usort($array, function($a, $b) {
  return new DateTime($a['datetime']) <=> new DateTime($b['datetime']);
});
29 голосов
/ 18 декабря 2013

Это должно работать. Я преобразовал дату в Unix время через strtotime.

  foreach ($originalArray as $key => $part) {
       $sort[$key] = strtotime($part['datetime']);
  }
  array_multisort($sort, SORT_DESC, $originalArray);

Версия с одной строкой будет использовать несколько методов массива:

array_multisort(array_map('strtotime',array_column($originalArray,'datetime')),
                SORT_DESC, 
                $originalArray);
5 голосов
/ 26 мая 2010

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) будет проще для парсера, но я думаю, что в вашем случае это не имеет значения.

4 голосов
/ 11 декабря 2014

$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);
4 голосов
/ 20 ноября 2013

Сортировка массива записей / assoc_arrays по указанному полю даты и времени mysql и по порядку:

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));
1 голос
/ 07 октября 2016

Вы можете просто решить эту проблему, используя usort () с функцией обратного вызова. Нет необходимости писать какие-либо пользовательские функции.

$your_date_field_name = 'datetime';
usort($your_given_array_name, function ($a, $b) use (&$your_date_field_name) {
    return strtotime($a[$your_date_field_name]) - strtotime($b[$your_date_field_name]);
});
1 голос
/ 03 апреля 2014

Я наткнулся на этот пост, но я хотел отсортировать по времени при возврате предметов в моем классе, и я получил ошибку.

Итак, я исследую веб-сайт 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)
0 голосов
/ 03 октября 2018

Для 'd/m/Y' даты:

usort($array, function ($a, $b, $i = 'datetime') { 
    $t1 = strtotime(str_replace('/', '-', $a[$i]));
    $t2 = strtotime(str_replace('/', '-', $b[$i]));

    return $t1 > $t2;
});

где $i - индекс массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...