В php как работает функция usort () - PullRequest
20 голосов
/ 10 декабря 2011

Я посмотрел документацию по php, онлайн-уроки и ни один из них о том, как на самом деле работает usort. У меня есть пример, с которым я играл ниже.

$data = array(

    array('msg' => 'some text','month' => 11,'level' => 10),

    array('msg' => 'some text','month' => 5,'level' => 10),

    array('msg' => 'some text','month' => 8,'level' => 10),

    array('msg' => 'some text','month' => 12,'level' => 10),

    array('msg' => 'some text','month' => 2,'level' => 10),

    array('msg' => 'some text','month' => 3,'level' => 10),

    array('msg' => 'some text','month' => 4,'level' => 10),

    array('msg' => 'some text','month' => 7,'level' => 10),

    array('msg' => 'some text','month' => 10,'level' => 10),

    array('msg' => 'some text','month' => 1,'level' => 10),

    array('msg' => 'some text','month' => 6,'level' => 10),

    array('msg' => 'some text','month' => 9,'level' => 10)

);

Я хотел иметь возможность сортировать месяцы с 12 до 1 (так как их неорганизовано) через некоторую помощь это было решением

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

usort($data, "cmp");

но я не понимаю, как функция cmp сортирует массив. я попытался распечатать каждую переменную $ a и $ b следующим образом:

function cmp($a, $b)
{
   echo "a: ".$a['month']."<br/>";
   echo " b: ".$b['month']."<br/>";
   echo "<br/><br/>";
}

и результат был

a: 3
b: 5

a: 9
b: 3

a: 3
b: 8

a: 6
b: 3

a: 3
b: 12

a: 1
b: 3

a: 3
b: 2

a: 10
b: 3

a: 3
b: 11

a: 7
b: 3

a: 4
b: 3

a: 12
b: 2

a: 5
b: 12

a: 12
b: 11

a: 8
b: 12

a: 5
b: 8

a: 2
b: 11

a: 6
b: 9

a: 7
b: 6

a: 6
b: 4

a: 10
b: 6

a: 1
b: 6

a: 9
b: 4

a: 7
b: 1

a: 10
b: 7

не имеет смысла, как работает сортировка и почему используется cmp ($ a, $ b). Я пытался распечатать все его процессы, как вы можете видеть, но не нашел решения, как все это работает ..

спасибо

Ответы [ 5 ]

26 голосов
/ 10 декабря 2011

Функция cmp сама не выполняет сортировку.Он просто сообщает usort, является ли значение меньше, равно или больше другого значения.Например, если $a = 5 и $b = 9, он вернет 1, чтобы указать, что значение в $b больше, чем значение в $a.

Сортировка производится по usort.

20 голосов
/ 10 декабря 2011

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

0:  both elements are the same
-1 (<0): the first element is smaller than the second
1 (>0):  the first element is greater

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

10 голосов
/ 10 декабря 2011

usort () использует реализацию Quicksort для сортировки массива, она вызывает вашу функцию cmp столько раз, сколько необходимо для полной сортировки массива с использованием этого алгоритма..

4 голосов
/ 08 ноября 2014

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

Функция, которую вы создали,

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

можно просто записать следующим образом

function compareMyStrings($a, $b){
    return strnatcmp($a["month"], $b["month"]);
}

Надеюсь, это поможет!

0 голосов
/ 27 ноября 2014

Это еще одно решение, которое я нашел

<code><?php 
$users = array( array( "peter", "male", "46"), 
                array( "hans", "male", "19"), 
                array( "john", "male", "30"), 
                array( "linda", "female", "54"), 
                array( "erika", "female", "79")); 
usort($users, "whatevername"); 
function whatevername($whatever1, $whatever2) 
{ 
    // $whatever1 and $whatever2 are items from the $user array. 
    // index [2] is the age. 
    // Check if $whatever1 is older than $whatever2. 
    // Return 1 tells usort to swap the positions. 
    return $whatever1[2] > $whatever2[2]; 
} 

echo("<pre>"); 
print_r($users); 
echo("
");?>
...