Общие сведения о обратных вызовах сортировки или сравнения функций массива с использованием пользовательских функций

Притворяйся, как будто я понятия не имею, что я делаю, чего у меня нет. Можете ли вы объяснить, как работают функции сортировки и сравнения массивов, которые требуют обратных вызовов?

Возьмем, uasort() функцию uasort() . Как я должен создать функцию обратного вызова для работы с этим? Что означает «-1», «+1» и «0», когда я пытаюсь сортировать данные? Будет ли он сканировать все элементы массива? Или это более эффективно? Что, если я хочу, чтобы «w» приходилось до «b», а «a» – до «x»? Любые советы, которые вы можете дать в этой, казалось бы, простой области, будут наиболее ценными.

Solutions Collecting From Web of "Общие сведения о обратных вызовах сортировки или сравнения функций массива с использованием пользовательских функций"

Я сделаю это!

Например, давайте возьмем список имен. Мы с тобой оба знаем, как отсортировать список имен в алфавитном порядке и сделать это сто базиллионов раз. То же самое относится, например, к числам. Компьютеры должны иметь возможность сортировать данные, где сортировка может быть не такой интуитивной.

Функции обратного вызова для сортировки массивов включают идею разрешить массиву содержать произвольный тип данных с обратным вызовом, предоставляющим «правила» для обозначения того, как любые два элемента в этом массиве связаны друг с другом. Таким образом, алгоритм сортировки может принимать этот массив данных, многократно вызывать функцию обратного вызова, чтобы определить, какие элементы принадлежат в каком порядке, и вернуть отсортированный список. В этом и заключается суть обратного вызова.

Если вам нужна буквальная аналогия, притворитесь, что вы передаете список данных другу, и они знают только метод сортировки, но не знают, как относятся элементы в вашем списке. Они «перезвонили» вам, задавая вопрос «Какой из этих двух элементов на первом месте?» И вы, зная данные и правило, берете предметы, применяете свои правила, а затем говорите другу ответ. В конечном счете, после повторения этого процесса несколько раз, ваши данные возвращаются к вам отсортированы.

Таким образом, «обратный вызов», который возвращает -1, 0 или 1, возвращает значение, которое говорит, когда вызывается с двумя частями данных, -1 говорит: «элемент один предшествует пункту два», 0 говорит: «элемент один равен элементу два ", а +1 говорит, что« пункт один следует за вторым пунктом ». Вы просто предоставляете сравнения, которые определяют, какое значение возвращается на основе правил для ваших данных. Вы можете определить произвольный набор данных и определить любое правило приоритета, которое вы пожелаете, в своем «пространстве». В стороне, это важная часть объектно-ориентированного программирования – я могу использовать эту идею «обратного вызова» для реализации универсальной версии сложного алгоритма сортировки и никогда не знать и не заботиться о сортировке данных – все потому, что программист, использующий этот «консервированный» механизм сортировки обеспечит «логическую сантехнику» потребностей сортировки.

Я думаю, что это достойный выстрел в объяснение, и все это в языковом агностическом отношении! 🙂 Надеюсь, это поможет.

Редактировать. Позвольте мне привести пример:

 List: Item # Value 1 12 2 15 3 9 4 26 5 4 

если я намереваюсь найти наименьший элемент в списке, я бы начал с пункта 1 и сравнил его с каждым оставшимся элементом в списке. Итак, первый проход, я бы сравнил пункт 1 с пунктом 2:

 compare(item(1),item(2)) 

который будет возвращать -1, поскольку значение 12 предшествует 15. Теперь я перехожу к следующему элементу в списке:

 compare(item(1),item(3)) 

который на этот раз возвращает 1, потому что 12 следует за 9, что означает, что элемент (3) теперь самый маленький предмет, найденный до сих пор. Теперь мы сравниваем:

 compare(item(3),item(4)) 

В этом случае сравните return -1, поскольку 9 предшествует 26, что приведет нас к окончательному сравнению:

 compare(item(3),item(5)) 

И этот вызов вернет +1, потому что 9 приходит после 4. Поскольку мы исчерпали все элементы в списке, мы знаем, что элемент (3) является наименьшим. Затем мы заменили этот элемент на «предыдущий» верхний элемент и повторим весь процесс, начиная с пункта (2). Это пример известной неэффективной «формы пузырьков», но работает для целей этой иллюстрации. Вот откуда берутся ссылки «первый элемент» и «второй элемент». Сортировка, независимо от языка и, как и любая другая проблема в области информатики, сводится к разрыву большой проблемы с небольшими укусами, а сортировка сводится к многократному сравнению двух элементов из более крупного списка.

Сначала прочтите руководство. Сводная страница – это хорошее место, где можно увидеть множество сортов. Чтобы ответить на некоторые из ваших вопросов:

Конечно, сортировка просматривает все элементы массива. Как еще он узнает, где может разместиться последний элемент? Но это не очень актуально. Вам не нужно понимать, какой алгоритм сортировки используется. Вам нужно только предоставить функцию, которая знает, как сравнивать любые два элемента в массиве, без каких-либо других элементов .

Алгоритм сортировки выполняет свою магию, вызывая вашу функцию всякий раз, когда он хочет знать, какой элемент «предшествует» другому. Он вызывает вашу функцию с двумя элементами, каждая в качестве параметра.

Ваша функция возвращает:

  • -1 (или любое число меньше нуля), если первый элемент меньше второго.
  • 0, если они равны
  • 1 (или любое число больше нуля), если первый элемент больше второго.

Вы можете написать метод для любого типа сортировки. Если вы хотите, чтобы «w» приходилось перед «b», вам нужно вернуть -1, если первый параметр начинается с «w», а второй параметр начинается с «b». Это слишком надуманный пример, когда я пытаюсь написать образец функции.

Но прежде чем вы сможете научиться писать обратный вызов, сначала вам нужно иметь повод для сортировки, чтобы у вас была цель.

Запустите этот пример, чтобы узнать, сколько раз функция сортировки вызывает ваш обратный вызов:

 <?php function mysort($a, $b) { echo "$a vs $b\n"; return $a - $b; } // randomly create an array with 1 to 20 as elements $data = range(1,20); shuffle($data); // before print_r($data); // sort usort($data, 'mysort'); // after print_r($data); 

Он систематически сортирует массив, используя алгоритм сортировки, используя информацию, которую ваша функция сообщает о том, как заказать два отдельных элемента.