这个回调示例(php手册)如何工作?

时间:2012-01-24 22:09:28

标签: php function callback usort

在下面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并不特别感兴趣,但它就在这个例子中。我的问题是,cmp函数的$ a和$ b参数是什么? usort给出$ x这是一个数组,所以我不明白cmp中发生了什么(代码很简单,但我不知道参数是什么)。

我的想象力告诉我,$ a和$ b都以某种方式迭代数组(唯一可以对其进行排序的方式)。有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

它们是阵列中的两个元素,相互比较。如果两个元素相等,则比较函数应返回0,如果$ a <0,则小于0。如果$ a&gt; $ b或大于0 $ B

php.net Example #2 usort() example using multi-dimensional array上的第二个例子说明了这一点。

由于每个数组索引都是一个数组本身,可能包含许多元素,因此它允许您根据所需的索引对数组进行排序。

在这些情况下,您只需要知道回调期望接收2个要比较的值,因为要对数组进行排序,您一次比较2个元素,直到列表被排序。有关排序算法的详情,请参阅QuicksortBubble sort

<?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";
}