PHP: сортировка массива по получасовым интервалам - PullRequest
0 голосов
/ 25 марта 2009

У меня здесь очень специфическая проблема. У меня есть многомерный массив, который я хочу отсортировать сначала по получасовым временным интервалам, а затем по датам. Функция array_multisort не будет соответствовать моим требованиям.

Пример: я хочу:

array(array("time"=>"12:15",
            "date"=>"2009-03-24"),
      array("time"=>"12:10",
            "date"=>"2009-03-23"),
      array("time"=>"12:00",
            "date"=>"2009-03-24"),
      array("time"=>"11:30",
            "date"=>"2009-03-24"));

В итоге:

array(array("time"=>"11:30",
            "date"=>"2009-03-24"),
      array("time"=>"12:10",
            "date"=>"2009-03-23"),
      array("time"=>"12:00",
            "date"=>"2009-03-24"),
      array("time"=>"12:15",
            "date"=>"2009-03-24"));

Я пытался сделать это с помощью uksort в сочетании с моей собственной функцией обратного вызова сортировки. Это код, который я сейчас использую:

uksort($myArray, "sortThirties");

function sortThirties($a, $b)
{
    //Get the two times as timestamps relative to today
    $one = strtotime($a['time']);
    $two = strtotime($b['time']);

    //Round them down to the nearest half-hour time
    $one = $one - ($one % 1800);
    $two = $two - ($two % 1800);

    //Return the difference if times are unequal
    //If times are equal, return the difference between dates.
    return ($one == $two ? strcmp($a['date'],$b['date']) : $one - $two);
}

Сразу после запуска этой функции я распечатываю массив с помощью print_r (), и порядок данных кажется случайным. Чего мне не хватает?

EDIT : Оказывается, порядок является полностью случайным. Я добавил эту строку в функцию sortThirties:

echo "<BR>",$a['time']," ",$b['time'];

и все, что я получил, было 50 страниц <BR>.

Я знаю, что массив правильно структурирован, потому что этот код, выполненный в том же массиве, дает мне несортированные данные:

foreach($myArray AS $a)
{
    echo "<BR>",$a['date']," ",$a['time'];
}

Единственное, о чем я могу думать, - это проблема с uksort. Есть мысли?

Ответы [ 2 ]

2 голосов
/ 25 марта 2009

Функция uksort сортирует массив по ключам, в то время как usort сортирует массив по значению, и ваш массив для сортировки выполняется:

$to_sort = array( 
                  0 => array("time"=>"12:15", "date"=>"2009-03-24"),
                  1 => array("time"=>"12:10", "date"=>"2009-03-23"),
                  2 => array("time"=>"12:00", "date"=>"2009-03-24"),
                  3 => array("time"=>"11:30", "date"=>"2009-03-24")
                );

Вы видите разницу? :)

2 голосов
/ 25 марта 2009

Очень странно. Я только что попробовал ваш код на массиве, похожем на тот, который вы предоставили, и он отлично работал. Возможности:

  • дополнительные пробелы в любом из времен / дат массива?
  • Различия версий PHP? Я заметил, что возвращаемое значение strtotime () было изменено в PHP версии 5.1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...