За последние 24 часа нас посетили 19452 программиста и 1610 роботов. Сейчас ищут 811 программистов ...

usort

Тема в разделе "PHP для новичков", создана пользователем Sinevik, 1 мар 2017.

  1. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    PHP:
    1. <?php
    2. function cmp($a, $b)
    3. {
    4.     if ($a == $b) {
    5.         return 0;
    6.     }
    7.     return ($a < $b) ? -1 : 1;
    8. }
    9.  
    10. $a = array(3, 2, 5, 6, 1);
    11.  
    12. usort($a, "cmp");
    13.  
    14. foreach ($a as $key => $value) {
    15.     echo "$key: $value\n";
    16. }
    17. ?>
    Объясните кто нибудь пожалуйста, почему оно так сортирует массив? Сортирует массив по значению используя пользовательскую функцию. Но как работает это пользовательская функция, почему в итоге получается такой результат
    0: 1
    1: 2
    2: 3
    3: 5
    4: 6
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Документацию читать не умеем. Пользовательская функция должна вернуть 0, если считает аргументы равными, 1, если первый аргумент больше второго и -1, если первый аргумент меньше. На основе этого usort принимает решение о перестановке
     
  3. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    Вот как раз это я понял. Вопрос в другом, она сравнивает какие аргументы Что это за аргументы? И как формируется это решение о перестановке? Вернула функция -1 и дальше что, какое решение примет usort?
     
    #3 Sinevik, 1 мар 2017
    Последнее редактирование: 1 мар 2017
  4. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
  5. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    Так а что в качестве аргументов передаётся в функцию?
     
  6. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Ну так ты echo напиши да сам увидишь и все поймешь.Нужно внимательно документацию читать.
    PHP:
    1. function cmp($a, $b)
    2. {
    3.     echo $a,$b."<br/>";
    4.     if ($a == $b) {
    5.         return 0;
    6.     }
    7.     return ($a < $b) ? -1 : 1;
    8. }
    9.  
    10. $a = array(3, 2, 5, 6, 1);
    11.  
    12. usort($a, "cmp");
    13.  
    14. foreach ($a as $key => $value) {
    15. }
     
  7. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    Выводит значения нашего массива. Первый $a второй $b. Но в каком то произвольном порядке, по парам. Короче ничего не понимаю, какая тут закономерность.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Алгоритм сортировки представляешь себе? В обычных функциях сортировки где-нибудь обязательно есть что-то вроде:
    PHP:
    1. if ($a[$i] < $a[$j]) {
    2.    $t = $a[$i];
    3.    $a[$i] = $a[$j];
    4.    $a[$j] = $t;
    5. }
    А в usort это место выглядит, грубо говоря
    PHP:
    1. if ($cpmFunc($a[$i], $a[$j]) === -1) {
    2.    // Сделать перестановку
    3. }
    Ну там не линейная сортировка, а quikSort, как тебе уже написали, поэтому порядок странный.
     
  9. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    Человек который только начал изучение php в это стоит сейчас вникать? Или пока можно пропустить этот quikSort вместе с (0, 1, -1)
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Такому человеку стоит самому реализовать на php несколько алгоритмов сортировки, особенно если почему-то php стал первым языком. Допустим, сортировку вставками, сортировку пузырьком, и ту же быструю сортировку (quick sort которая).
    http://pro-prof.com/archives/1462

    А так, лично я даже не знал, что у usort быстрая сортировка. Теперь знаю :) Но я в своё время разбирал этот алгоритм, реализовывал его на Pascal, С++, так что мне понятно.

    Что сложного в том, чтобы вернуть из функции 0, 1 или -1, я вообще не понимаю. Почитай про callable вообще, про использование.

    Вообще, для каждого начинающего программиста должна быть must read книжечка Н. Вирта "Алгоритмы + структуры данных = программы" (хотя она и с примерами на Pascal, их можно разобрать, даже не изучая Pascal, поскольку программа на нём максимально близка к обычному английскому). Она не такая сложная, как классическая книжка Д. Кнута (которую, каюсь, не осилил :(), но даёт чёткое понятие, как строится алгоритм.
    --- Добавлено ---
    Вообще, я кусок кода, участвующего почти в любой сортировке привёл, он как, понятен?
     
  11. Sinevik

    Sinevik Новичок

    С нами с:
    7 фев 2017
    Сообщения:
    83
    Симпатии:
    4
    Что бы вернуть 0, 1 -1 из функции у меня никакой сложности нет! Я другое не понимаю, как это влияет на сортировку
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так это и есть сортировка.
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Чувак, я же тебе кодом показал, как эта функция используется потом. Вот в этом сообщении: https://php.ru/forum/threads/usort.62418/#post-505667. Сразу видно, что ты ни разу никакую сортировку не программировал...