기본 1 차원 배열
$array = array(3, 5, 2, 8);
적용 가능한 정렬 기능 :
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
이들의 차이점은 단지 키-값 연관이 유지되는지 ( " a
"기능), 낮은 것에서 높은 것 또는 반대로 r
정렬하는지 ( " "), 값 또는 키를 정렬하는지 ( " ") 여부 k
와 값을 비교하는 방법입니다. ( " nat
"대 정상). 개요 및 자세한 내용에 대한 링크는 http://php.net/manual/en/array.sorting.php 를 참조 하십시오.
객체 배열을 포함한 다차원 배열
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
$array
각 항목의 키 'foo' 를 기준으로 정렬하려면 사용자 정의 비교 기능 이 필요 합니다 . 위의 sort
함수와 관련 함수는 비교 및 정렬 방법을 알고있는 간단한 값에서 작동합니다. PHP는 단순히 무엇을 할 "알고"하지 않는 복잡한 값 같은 array('foo' => 'bar', 'baz' => 42)
생각; 그래서 당신은 그것을 말해야합니다.
그러기 위해서는 비교 함수 를 만들어야 합니다 . 이 함수는 두 개의 요소를 취하며 0
이러한 요소가 동일한 것으로 간주되면 반환해야합니다 0
. 첫 번째 값이 낮은 0
경우 보다 낮은 값과 첫 번째 값이 높은 경우보다 높은 값입니다. 그게 전부입니다.
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
종종 익명 함수 를 콜백으로 사용하려고합니다 . 메소드 또는 정적 메소드를 사용하려면 PHP에서 콜백을 지정하는 다른 방법을 참조하십시오 .
그런 다음 다음 기능 중 하나를 사용하십시오.
다시 말하지만 키-값 연결을 유지하고 값 또는 키를 기준으로 정렬하는 방식 만 다릅니다. 자세한 내용은 해당 설명서를 참조하십시오.
사용법 예 :
usort($array, 'cmp');
usort
배열에서 두 항목을 가져 와서 cmp
함수를 호출합니다 . 그래서 cmp()
호출 할 것 $a
같은 array('foo' => 'bar', 'baz' => 42)
과 $b
다른 것 array('foo' => ..., 'baz' => ...)
. 그런 다음 함수는 usort
어느 값이 더 큰지 또는 같은지 여부 로 돌아갑니다 . usort
다른 값을 전달하는 과정이 반복 $a
및 $b
어레이가 정렬 될 때까지한다. cmp
기능은 여러 번 호출되는 최소한 의 값이있는만큼 여러 번 $array
다른 값의 조합, $a
그리고 $b
때마다.
이 아이디어에 익숙해 지려면 다음을 시도하십시오.
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
두 항목을 비교하는 사용자 정의 방법을 정의하기 만하면됩니다. 그것은 모든 종류의 값에서 작동합니다.
그건 그렇고, 이것은 모든 값에서 작동하며 값은 복잡한 배열 일 필요는 없습니다. 사용자 지정 비교를 원한다면 간단한 숫자 배열로도 비교할 수 있습니다.
sort
참조로 정렬하고 유용한 것을 반환하지 않습니다!
배열 이 제자리에 정렬 되므로 반환 값을 아무것도 할당 할 필요가 없습니다. 정렬 된 배열이 아닌으로 $array = sort($array)
배열을 대체합니다 true
. 그냥 sort($array);
작동합니다.
맞춤 숫자 비교
baz
숫자 키인 키 를 기준으로 정렬하려면 다음을 수행하십시오.
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
PoWEr oF MATH 덕분에 $a
이보다 작거나 같거나 큰지 여부에 따라 <0, 0 또는> 0 값을 반환합니다 $b
.
float
값이 줄어들고 int
정밀도 가 떨어지기 때문에 값에는 적합하지 않습니다 . 명시 적 사용 -1
, 0
그리고 1
대신 값을 반환합니다.
사물
객체 배열이있는 경우 동일한 방식으로 작동합니다.
function cmp($a, $b) {
return $a->baz - $b->baz;
}
기능
함수 호출을 포함하여 비교 함수 내에서 필요한 모든 작업을 수행 할 수 있습니다.
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
현
첫 번째 문자열 비교 버전에 대한 바로 가기 :
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
정확히 예상됩니다 무엇 cmp
여기서, 반환 -1
, 0
또는 1
.
우주선 운영자
PHP 7은 우주선 연산자를 도입했습니다.이 연산자 는 유형 간 비교보다 동일 / 소규모 / 대형을 통합하고 단순화합니다.
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
여러 필드로 정렬
주로을 기준으로 정렬 foo
하지만 foo
두 요소가 같은 경우 다음을 기준으로 정렬합니다 baz
.
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
익숙한 사용자의 경우을 사용하는 SQL 쿼리와 동일합니다 ORDER BY foo, baz
.
또한 이 매우 간결한 속기 버전 과 임의의 수의 키에 대해 이러한 비교 함수를 동적으로 작성하는 방법을 참조하십시오 .
수동 정적 순서로 정렬
"foo", "bar", "baz" 와 같은 " 수동 순서"로 요소를 정렬하려면 다음을 수행하십시오.
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
위의 모든 사항에 대해 PHP 5.3 이상을 사용하는 경우 (실제로해야하는 경우) 익명 코드를 사용하여 짧은 코드를 사용하고 다른 전역 함수가 떠 다니는 것을 피하십시오.
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
이것이 복잡한 다차원 배열을 얼마나 간단하게 정렬 할 수 있는가입니다. 다시 한 번, PHP 를 가르치는 관점 에서 두 항목 중 어느 것이 "더 큰"항목인지 알 수 있습니다 . PHP가 실제 정렬을 수행하게하십시오.
또한 위의 모든 항목에서 오름차순과 내림차순을 전환하려면 간단히 $a
and $b
인수 를 바꾸십시오 . 예 :
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
다른 배열을 기준으로 한 배열 정렬
그리고 array_multisort
하나의 배열을 다른 배열을 기준으로 정렬 할 수 있는 독특합니다 .
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
여기에 예상되는 결과는 다음과 같습니다.
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
array_multisort
거기에 도착하는 데 사용하십시오 :
array_multisort($array1, $array2);
PHP 5.5.0 array_column
부터 다차원 배열에서 열을 추출하고 해당 열에서 배열을 정렬하는 데 사용할 수 있습니다 .
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
PHP 7.0.0부터는 객체 배열에서 속성을 추출 할 수도 있습니다.
더 일반적인 경우가 있으면이 답변을 자유롭게 편집하십시오.