PHP: <?php function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "cmp"); foreach ($a as $key => $value) { echo "$key: $value\n"; } ?> Объясните кто нибудь пожалуйста, почему оно так сортирует массив? Сортирует массив по значению используя пользовательскую функцию. Но как работает это пользовательская функция, почему в итоге получается такой результат 0: 1 1: 2 2: 3 3: 5 4: 6
Документацию читать не умеем. Пользовательская функция должна вернуть 0, если считает аргументы равными, 1, если первый аргумент больше второго и -1, если первый аргумент меньше. На основе этого usort принимает решение о перестановке
Вот как раз это я понял. Вопрос в другом, она сравнивает какие аргументы Что это за аргументы? И как формируется это решение о перестановке? Вернула функция -1 и дальше что, какое решение примет usort?
Ну так ты echo напиши да сам увидишь и все поймешь.Нужно внимательно документацию читать. PHP: function cmp($a, $b) { echo $a,$b."<br/>"; if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "cmp"); foreach ($a as $key => $value) { }
Выводит значения нашего массива. Первый $a второй $b. Но в каком то произвольном порядке, по парам. Короче ничего не понимаю, какая тут закономерность.
Алгоритм сортировки представляешь себе? В обычных функциях сортировки где-нибудь обязательно есть что-то вроде: PHP: if ($a[$i] < $a[$j]) { $t = $a[$i]; $a[$i] = $a[$j]; $a[$j] = $t; } А в usort это место выглядит, грубо говоря PHP: if ($cpmFunc($a[$i], $a[$j]) === -1) { // Сделать перестановку } Ну там не линейная сортировка, а quikSort, как тебе уже написали, поэтому порядок странный.
Человек который только начал изучение php в это стоит сейчас вникать? Или пока можно пропустить этот quikSort вместе с (0, 1, -1)
Такому человеку стоит самому реализовать на php несколько алгоритмов сортировки, особенно если почему-то php стал первым языком. Допустим, сортировку вставками, сортировку пузырьком, и ту же быструю сортировку (quick sort которая). http://pro-prof.com/archives/1462 А так, лично я даже не знал, что у usort быстрая сортировка. Теперь знаю Но я в своё время разбирал этот алгоритм, реализовывал его на Pascal, С++, так что мне понятно. Что сложного в том, чтобы вернуть из функции 0, 1 или -1, я вообще не понимаю. Почитай про callable вообще, про использование. Вообще, для каждого начинающего программиста должна быть must read книжечка Н. Вирта "Алгоритмы + структуры данных = программы" (хотя она и с примерами на Pascal, их можно разобрать, даже не изучая Pascal, поскольку программа на нём максимально близка к обычному английскому). Она не такая сложная, как классическая книжка Д. Кнута (которую, каюсь, не осилил ), но даёт чёткое понятие, как строится алгоритм. --- Добавлено --- Вообще, я кусок кода, участвующего почти в любой сортировке привёл, он как, понятен?
Что бы вернуть 0, 1 -1 из функции у меня никакой сложности нет! Я другое не понимаю, как это влияет на сортировку
Чувак, я же тебе кодом показал, как эта функция используется потом. Вот в этом сообщении: https://php.ru/forum/threads/usort.62418/#post-505667. Сразу видно, что ты ни разу никакую сортировку не программировал...