2012-01-24 4 views
1

http://php.net/manual/en/function.usort.phpの下の例では、コールバック関数が呼び出されます。このコールバックの例(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

これらは、アレイから2つの要素が互いに比較されます。比較関数は、2つの要素が等しい場合は0を返し、$ a> $ bの場合は0より小さい$ a < $ bまたは0より大きい場合0を返します。

php.net Example #2 usort() example using multi-dimensional arrayの2番目の例はこれを少し詳しく示しています。

各配列インデックスは、配列自体の可能性がある要素数が多いため、必要なインデックスに基づいて配列を並べ替えることができます。

これらのケースでは、配列をソートするためにリストがソートされるまで一度に2つの要素を比較するため、コールバックが比較する2つの値を受け取ることが必要であることがわかります。並べ替えアルゴリズムの詳細については、QuicksortまたはBubble 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"; 
} 
+0

ありがとうdrew010。私は今理解しています - しかし、私はあなたがこれをどのように理解したのか不思議です。マニュアルに含まれる関数の定義がわかりませんでした。 '比較関数は、または第1引数がそれぞれ第2引数よりも小さい、等しい、または大きいとみなされる場合はゼロより大きい値を返します。 ' – TenLeftFingers

+0

比較関数は、PHP関数[strcmp()](http://php.net/strcmp)と同じ戻り値を使用します。これはCからも借用されているため、この関数の仕組みに精通していました。そこではあまり明確ではありませんが、strcmpを調べるともう少しクリアになるかもしれません。 – drew010

関連する問題