как работает usort?

Я просмотрел документацию по 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). я попытался распечатать все его процессы, как вы можете видеть, но не пришел к какому-либо решению, как все это работает.

благодаря

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

Сортировка выполняется с помощью usort .

Обратный вызов, предоставляемый функциям сортировки в 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 вероятно, использует какой-то quicksort или mergesort внутри. Для каждого сравнения он вызывает ваш обратный вызов с двумя элементами, а затем решает, нужно ли их менять или нет.

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

Как отмечали другие, usort использует алгоритм Quicksort. С другой стороны, вам не нужно явно сравнивать сравнение двух строк. Вы можете использовать методы сравнения строк 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"]); } 

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

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

 <?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("</pre>"); ?>