Я пытаюсь понять, как работает функция php usort. У меня есть такой код:Как понять логику usort?
<?php
$users[] = array('login' => 'moon', 'name' => 'Chris');
$users[] = array('login' => 'star', 'name' => 'Piter');
$users[] = array('login' => 'mars', 'name' => 'Tim');
$users[] = array('login' => 'earth', 'name' => 'Garry');
function compare($a, $b) {
echo $a['login'] . '--' . $b['login'] . '<br />';
echo strcmp($a['login'], $b['login']) . '<br />';
return strcmp($a['login'], $b['login']);
}
usort($users, "compare");
echo '<pre>'; print_r($users); echo '</pre>';
?>
Он выведет такой результат:
star--moon
1
star--mars
1
earth--star
-1
moon--earth
1
mars--moon
-1
earth--mars
-1
Array
(
[0] => Array
(
[login] => earth
[name] => Garry
)
[1] => Array
(
[login] => mars
[name] => Tim
)
[2] => Array
(
[login] => moon
[name] => Chris
)
[3] => Array
(
[login] => star
[name] => Piter
)
)
Насколько я понимаю, вторые пары должны быть функцией сравнения, и он может возвращать только 3 значения (-1,0, 1) и usort
используйте этот результат, чтобы отсортировать массив? Также я прочитал: usort
использует реализацию Quicksort для сортировки массива. Вот почему звезда первая и moon - секунда? Быстрое разделение массива на две части, а затем сортировку? И могу ли я реализовать эту функцию для массива 2,3 измерений?
Отличный ответ. Но вы можете объяснить один момент. В статье на ваш ответ написано, что лучше использовать 'shuffle' перед сортировкой. Этот «shuffle» не влияет на элемент поворота? Это функция алгоритма, что лучше работать с перетасованными массивами? –
Да, перетасовка массива перед сортировкой может избежать сценариев наихудшего сценария, например, когда массив уже отсортирован, но алгоритм по-прежнему выбирает средний элемент как элемент поворота. Но этот средний элемент, вероятно, является другим элементом после перетасовки массива, чем до тасования. –