PHP сортировка массива по дате mysql - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть массив, который я хотел бы отсортировать, используя поле даты из базы данных MySQL.

Вот пример массива с именем news в моем классе:

[48] => Array
    (
        [id] => 14
        [type] => 3
        [updated] => 2010-04-17 13:54:42
    )

[49] => Array
    (
        [id] => 15
        [type] => 3
        [updated] => 2010-04-17 13:57:21
    )

Я хочу отсортировать по полю updated.

У меня есть код, который я запустил, но не уверен, как его завершить и заставить его работать.

class ProcessClass {
  // ....
  function sortNews($x)
  {
    usort($this->news, array("ProcessClass", "cmp")); //correct sort type?
  }

  function cmp($a, $b)
  {
    //  missing code
  }

Может кто-нибудь помочь ??

Ответы [ 3 ]

9 голосов
/ 20 апреля 2010

В большинстве случаев будет проще добавить ORDER BY updated в конец запроса SQL, однако, если ваши данные поступают из нескольких источников и вам нужно прибегнуть к PHP, вы можете использовать usort () для сортировки массива на основе определенной пользователем функции. Чтобы использовать функцию класса для сравнения, функция ДОЛЖНА быть статической. Он может просто сравнить значение updated в массиве, используя функцию strcmp () , которая возвращает именно то, что вам нужно отсортировать по дате в формате MySQL:

class ProcessClass {
  // this must be static
  static function sort_by_updated($a, $b)
  {
    return strcmp($a['updated'], $b['updated']);
  }

  function sortNews()
  {
    usort($this->news, array("ProcessClass", "sort_by_updated")); 
  }

Если вы хотите изменить порядок сортировки, просто поменяйте местами параметры сравнения: return strcmp($b['updated'], $a['updated'])

1 голос
/ 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 (str_to_upper($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));
0 голосов
/ 20 апреля 2010

Если вам действительно нужно использовать сортировку PHP, вы можете перейти к реализации usort () .

<?php
function mysql_datesort($a, $b)
{
    if ($a == $b) {
        return 0;
    }

    return ($a->date_field < $b->date_field) ? -1 : 1; //custom check here
}

$a = array(); //your PHP array here...

usort($a, "mysql_datesort");

?>
...