Параметры функции обратного вызова PHP USORT

Если бы Вы хотите, чтобы Регистратор был на экземпляр тогда, да, Вы хотели бы сделать его переходным процессом, если Вы собираетесь сериализировать свои объекты. Регистраторы Log4J не являются сериализуемыми, не в версии Log4J, который я использую так или иначе, поэтому если Вы не сделаете свой переходный процесс полей Logger, то Вы получите исключения на сериализации.

11
задан Billy ONeal 8 June 2011 в 01:55
поделиться

2 ответа

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

Если у вас есть средства для сравнения двух элементов, вы можете использовать алгоритм сортировки по вашему выбору .

Если вы не знакомы, вы могли бы посмотреть, как простой наивный алгоритм, такой как bubbleort , будет использовать функцию сравнения.

За кулисами PHP использует быстрая сортировка .

5
ответ дан 3 December 2019 в 01:45
поделиться

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

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

<?php

$myArray = array(1, 19, 18, 12, 56);

function compare($a, $b) {
    echo "Comparing $a to $b\n";
    if ($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

usort($myArray,"compare");
print_r($myArray);
?>

Выходные данные

vinko@mithril:~$ php sort.php
Comparing 18 to 19
Comparing 56 to 18
Comparing 12 to 18
Comparing 1 to 18
Comparing 12 to 1
Comparing 56 to 19
Array
(
    [0] => 1
    [1] => 12
    [2] => 18
    [3] => 19
    [4] => 56
)

Из выходных данных и взглянув на источник мы видим, что используемая сортировка действительно является реализацией quicksort , проверьте Zend / zend_qsort.c в исходном коде PHP (связанная с версией немного устарела, но не сильно изменилась).

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

Некоторые дополнительные пояснения в виде схем.

Step 0: (1,19,18,12,56); //Pivot: 18, 
Step 1: (1,12,18,19,56); //After the first reordering
Step 2a: (1,12);         //Recursively do the same with the lesser, here 
                         //pivot's 12, and that's what it compares next if 
                         //you check the output.
Step 2b: (19,56);        //and do the same with the greater
32
ответ дан 3 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: