배열 usort

(PHP 4, PHP 5, PHP 7, PHP 8)

usort — 사용자 정의 비교 함수를 사용하여 값별로 배열 정렬


설명

usort(array &$array, callable $callback): bool

순서를 결정하기 위해 사용자 제공 비교 함수를 사용하여 값을 기준으로 array을 정렬합니다.

메모: 두 구성원이 같은 것으로 비교되면 원래 순서를 유지합니다. PHP 8.0.0 이전에는 정렬된 배열의 상대적 순서가 정의되지 않았습니다.

메모: 이 함수는 array의 요소에 새 키를 할당합니다. 단순히 키를 재정렬하는 것이 아니라 할당되었을 수 있는 기존 키를 제거합니다.


매개변수

array
입력 배열입니다.
callback
비교 함수는 첫 번째 인수가 두 번째 인수보다 각각 작거나 같거나 큰 것으로 간주되는 경우 0보다 작거나 같거나 큰 정수를 반환해야 합니다.

callback(mixed $a, mixed $b): int


반환 값

항상 true를 반환합니다.


변경 로그

버전 설명
8.0.0 callback에서 매개변수가 참조로 전달될 것으로 예상하는 경우 이 함수는 이제 E_WARNING을 내보냅니다.

Examples

예제 #1 usort() 예제

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

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

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>
                  
                

위의 예는 다음을 출력합니다.

0: 1
1: 2
2: 3
3: 5
4: 6
                

spaceship 연산자를 사용하여 내부 비교를 더욱 단순화할 수 있습니다.

                  
<?php
function cmp($a, $b)
{
    return $a <=> $b;
}

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

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>
                  
                

메모: 분명히 이 사소한 경우에는 sort() 함수가 더 적절할 것입니다.

예제 #2 다차원 배열을 사용한 usort() 예제

                  
<?php
function cmp($a, $b)
{
    return strcmp($a["fruit"], $b["fruit"]);
}

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

usort($fruits, "cmp");

foreach ($fruits as $key => $value) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
                  
                

다차원 배열을 정렬할 때 $a 및 $b에는 배열의 첫 번째 인덱스에 대한 참조가 포함됩니다.

위의 예는 다음을 출력합니다.

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons
                

예제 #3 객체의 멤버 함수를 사용하는 usort() 예제

                  
<?php
class TestObj {
    private string $name;

    function __construct($name)
    {
        $this->name = $name;
    }

    /* This is the static comparing function: */
    static function cmp_obj($a, $b)
    {
        return strtolower($a->name) <=> strtolower($b->name);
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

usort($a, [TestObj::class, "cmp_obj"]);

foreach ($a as $item) {
    echo $item->name . "\n";
}
?>
                  
                

위의 예는 다음을 출력합니다.

b
c
d
                

예제 #4 클로저를 사용하여 다차원 배열을 정렬하는 usort() 예제

                  
<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');

function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

usort($array, build_sorter('key_b'));

foreach ($array as $item) {
    echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>
                  
                

위의 예는 다음을 출력합니다.

y, a
x, b
z, c
                

예제 #5 spaceship 연산자를 사용하는 usort() 예제

spaceship 연산자를 사용하면 여러 축에서 복합 값을 간단하게 비교할 수 있습니다. 다음 예에서는 성을 기준으로 $people을 정렬한 다음 성이 일치하는 경우 이름을 기준으로 정렬합니다.

                  
<?php
$people[0] = ['first' => 'Adam', 'last' => 'West'];
$people[1] = ['first' => 'Alec', 'last' => 'Baldwin'];
$people[2] = ['first' => 'Adam', 'last' => 'Baldwin'];

function sorter(array $a, array $b) {
    return [$a['last'], $a['first']] <=> [$b['last'], $b['first']];
}

usort($people, 'sorter');

foreach ($people as $person) {
    print $person['last'] . ', ' . $person['first'] . PHP_EOL;
}
?>
                  
                

위의 예는 다음을 출력합니다.

Baldwin, Adam
Baldwin, Alec
West, Adam
                

기타

  • uasort() - 사용자 정의 비교 함수를 사용하여 배열을 정렬하고 인덱스 연결을 유지합니다.
  • uksort() - 사용자 정의 비교 함수를 사용하여 키별로 배열 정렬
  • 배열 정렬 함수 비교