usort в PHP неверные результаты

У меня есть список времени игры, например, 13:05, 14:05, 19:10, 22:15 и т. д. Я использую многомерный массив и strcmp с usort для сортировки этих игр в правильном порядке от самой ранней до последней.

Игры сортируются, однако любая игра, которая начинается в 22:00, отображается перед любой другой игрой. Итак, мой текущий вид выглядит следующим образом:

Dodgers 7/29/16 10:05 PM
Angels 7/29/16 10:10 PM
A's 7/29/16 10:15 PM
Cubs 7/29/16 2:20 PM
Jays 7/29/16 7:05PM
Rays 7/29/16 7:15PM
Astros 7/29/16 8:05 PM

так далее

Я устраняю эту проблему уже несколько дней. Я попытался преобразовать свою строку даты, используя strtotime(), но usort это совсем не нравится, и моя сортировка становится случайной. Я попытался отформатировать дату/время, используя дефис вместо косой черты, но ничего не изменилось. Я также «очистил» свою строку даты/времени от любых дополнительных символов. Вот мой код:

$array[$timedate] = $string;

 // Multidimensional array of 'games'
$games[] = array('date' => $timedate,
                 'title' => $string);

// compare the dates and times
function cmp($a, $b)
{
    return strcmp($a['date'], $b['date']);
}

// Sort the array
usort($games, "cmp");

person xar86413    schedule 29.07.2016    source источник


Ответы (1)


Usort хочет определить определяемую пользователем функцию сравнения. Вам это не нужно. Используйте классическую сортировку в strtotime().

Или вы можете использовать ksort, как вы упомянули ниже. Вот код, который работает:

$game_times = array(array("Dodgers", "7/29/16 10:05 PM"), 
                    array("Angels", "7/29/16 10:10 PM"), 
                    array("A's", "7/29/16 10:15 PM"), 
                    array("Cubs", "7/29/16 2:20 PM"), 
                    array("Jays", "7/29/16 7:05PM"), 
                    array("Rays", "7/29/16 7:15PM"), 
                    array("Astros", "7/29/16 8:05 PM"));

foreach ($game_times as $item)
{
    $games[strtotime($item[1])] = array('date' => $item[1],
                                        'title' => $item[0]);
}

ksort($games);

var_dump($games);
person von Oak    schedule 29.07.2016
comment
Я попытался использовать sort(), и он выдал ошибку, но это заставило меня подумать, что usort был неправильным методом сортировки. Итак, я понял, что ksort (который сортирует по ключу многомерного массива) поможет, и это сработало. Спасибо, что переключили мое внимание. - person xar86413; 29.07.2016
comment
Хорошая идея с ксортом. Я немного уточнил это в своем ответе. - person von Oak; 29.07.2016