2012-01-24 2 views
1

아래 예제에서는 http://php.net/manual/en/function.usort.php에서 콜백 함수가 호출됩니다.이 콜백 예제 (php manual)는 어떻게 작동합니까?

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을 반환하고, $ a> $ b 인 경우$ b 또는 0보다 큰 경우 0보다 작습니다.

두 번째 예는 Example #2 usort() example using multi-dimensional array입니다.

각 배열 인덱스는 가능한 많은 요소가있는 배열 자체이므로 원하는 인덱스를 기반으로 배열을 정렬 할 수 있습니다.

이러한 경우 콜백이 비교할 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. 지금은 이해하고 있습니다. 그러나 궁금한 점은 메뉴얼에있는 함수의 정의가 나에게 분명하지 않다는 것입니다. '비교 함수는 반드시 작거나 같거나 작은 정수를 반환해야합니다. 또는 첫 x 째 인수가 각각 두 x 째 인수보다 작거나 같거나 큰 인수로 간주되면 0보다 큰 값. ' – TenLeftFingers

+0

비교 함수는 PHP 함수 [strcmp()] (http://php.net/strcmp)와 동일한 반환 값을 사용합니다.이 함수는 C에서 빌려온 함수이기 때문에이 함수의 작동 방식을 잘 알고있었습니다. 거기에는 분명하지 않지만, strcmp를 살펴보면 좀 더 명확해질 것입니다. – drew010

관련 문제