Как работает этот пример обратного вызова (руководство по PHP)? - PullRequest
2 голосов
/ 25 января 2012

В приведенном ниже примере из http://php.net/manual/en/function.usort.php, вызывается функция обратного вызова.

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

$x = array(3, 2, 5, 6, 1);

usort($x, "cmp");

foreach ($x as $key => $value) {
    echo "$key: $value<br>";
}

Меня не особо интересует usort, но это в примере. Мой вопрос: каковы аргументы $ a и $ b для функции cmp? usort получает $ x, который является массивом, поэтому я не понимаю, что происходит в cmp (код прост, но я не знаю, каковы аргументы).

Мое воображение подсказывает мне, что и $ a, и $ b итеративно выполняют итерацию массива (единственный способ сортировки). Может кто-нибудь пролить свет на это?

1 Ответ

2 голосов
/ 25 января 2012

Это два элемента из массива, которые сравниваются друг с другом.Функция сравнения должна возвращать 0, если два элемента равны, меньше 0, если $ a <$ b, или больше 0, если $ a> $ b

Второй пример на php.net Example #2 Пример использования usort () с использованием многомерного массива иллюстрирует это немного подробнее.

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

В этих случаях вам просто нужно знать, что обратные вызовы ожидают получения 2 значений для сравнения, поскольку для сортировки массива вы сравниваете 2 элемента за раз, пока список не будет отсортирован.См. Быстрая сортировка или Пузырьковая сортировка для получения дополнительной информации об алгоритмах сортировки.

<?php
function cmp($a, $b)
{
    // usort gives 2 values from the array to compare, $a and $b
    // we compare the "fruit" index from each item so the array is
    // ultimately sorted by fruit
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...