배열 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보다 작거나 같거나 큰 정수를 반환해야 합니다.
반환 값
항상 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() - 사용자 정의 비교 함수를 사용하여 키별로 배열 정렬
- 배열 정렬 함수 비교