Как работает 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). я попытался распечатать все его процессы, как вы можете видеть, но не пришел к какому-либо решению, как все это работает.
спасибо
Ответы
Ответ 1
Сама функция cmp
не выполняет сортировку. Он просто сообщает usort
, если значение меньше, равно или больше другого значения. Например. если $a = 5
и $b = 9
он вернет 1, чтобы указать, что значение в $b
больше, чем значение в $a
.
Сортировка выполняется с помощью usort
.
Ответ 2
Обратный вызов, предоставляемый функциям сортировки в 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. Для каждого сравнения он вызывает ваш обратный вызов с двумя элементами, а затем решает, нужно ли их заменять или нет.
Ответ 3
usort() использует реализацию Quicksort, чтобы отсортировать массив, он вызывает вашу функцию cmp
столько раз, сколько нужно, чтобы полностью сортировать массив с использованием этого алгоритма.
Ответ 4
Как упоминалось выше, 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"]);
}
Надеюсь, это поможет!
Ответ 5
Это другое решение, которое я нашел
<?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>");
?>