PHP에서 어레이와 데이터를 정렬하려면 어떻게 해야 합니까?
이 질문은 PHP의 배열 정렬에 대한 질문의 참조를 목적으로 합니다.특정 케이스가 독특하고 새로운 질문을 할 가치가 있다고 생각하기 쉽지만, 대부분은 실제로 이 페이지의 솔루션 중 하나를 약간 변형한 것입니다.
이 질문의 중복으로 종료된 경우, 아래의 모든 질문과 확연히 다른 이유를 설명할 수 있는 경우에만 다시 질문해 주십시오.
PHP에서 어레이를 정렬하려면 어떻게 해야 합니까?
PHP에서 복잡한 어레이를 정렬하려면 어떻게 해야 합니까?
PHP에서 객체 배열을 정렬하려면 어떻게 해야 합니까?
PHP의 기존 함수를 사용한 실제적인 답변은 1. 정렬 알고리즘에 대한 학술적인 상세 답변(PHP의 함수가 구현하고 있으며, 매우 복잡한 경우에 필요할 수 있음)은 2를 참조하십시오.
기본 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
기능을 합니다. So 그렇게cmp()
will be called with 와 함께 호출될 것이다.$a
as ~하듯이array('foo' => 'bar', 'baz' => 42)
and 그리고.$b
as another 다른 사람으로서array('foo' => ..., 'baz' => ...)
. . The function then returns to 그러면 함수는 로 돌아갑니다.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를 사용하면 이 값은 0, 0 또는 >0 중 어느 쪽에 해당하는지 여부에 따라 반환됩니다.$a
$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
가 2개의 로 정렬되어 , 의 요소가 동일합니다.baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
합니다.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
★★★★★★★★★★★★★★★★★」$b
§:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
다른 어레이를 기준으로 배열 정렬
또, 다른 어레이에 근거해 어레이를 정렬할 수 있는 독특한 것도 있습니다.
$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);
.5부터는 PHP 5.5.0을 사용할 수 .부터는array_column
다차원 배열에서 열을 추출하고 해당 열의 배열을 정렬하려면:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
또한 두 개 이상의 열을 양방향으로 정렬할 수도 있습니다.
array_multisort(array_column($array, 'foo'), SORT_DESC,
array_column($array, 'bar'), SORT_ASC,
$array);
PHP 7.0.0에서는 오브젝트 배열에서 속성을 추출할 수도 있습니다.
일반적인 케이스가 있는 경우는, 이 답변을 자유롭게 편집해 주세요.
음, 대부분의 기본적인 방법은 이미 deceze에서 다루어지고 있습니다. 다른 종류의 방법을 찾아보겠습니다.
SPL을 사용한 정렬
SplHeap
class SimpleHeapSort extends SplHeap {
public function compare($a, $b) {
return strcmp($a, $b);
}
}
// Let's populate our heap here (data of 2009)
$heap = new SimpleHeapSort();
$heap->insert("a");
$heap->insert("b");
$heap->insert("c");
echo implode(PHP_EOL, iterator_to_array($heap));
산출량
c
b
a
SplMaxHeap
SplMaxHeap 클래스는 힙의 주요 기능을 제공하여 최대값을 상단에 유지합니다.
$heap = new SplMaxHeap();
$heap->insert(1);
$heap->insert(2);
$heap->insert(3);
SplMinHeap
SplMinHeap 클래스는 힙의 주요 기능을 제공하여 최소값을 맨 위에 유지합니다.
$heap = new SplMinHeap ();
$heap->insert(3);
$heap->insert(1);
$heap->insert(2);
기타 종류의 정렬
버블 정렬
버블 정렬에 대한 위키피디아 기사:
버블 정렬(싱킹 정렬이라고도 함)은 정렬할 목록을 반복하여 스텝업하여 인접 항목의 각 쌍을 비교하고 순서가 잘못된 경우 서로 바꿈으로써 작동하는 단순한 정렬 알고리즘입니다.목록이 정렬되었음을 나타내는 스왑이 필요하지 않을 때까지 목록 통과가 반복됩니다.알고리즘의 이름은 작은 요소가 목록의 맨 위로 "버블"되는 방식에서 유래합니다.요소 조작에는 비교만 사용되므로 비교 정렬입니다.알고리즘은 간단하지만 다른 대부분의 정렬 알고리즘은 큰 목록에 대해 더 효율적입니다.
function bubbleSort(array $array) {
$array_size = count($array);
for($i = 0; $i < $array_size; $i ++) {
for($j = 0; $j < $array_size; $j ++) {
if ($array[$i] < $array[$j]) {
$tem = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $tem;
}
}
}
return $array;
}
선택 정렬
선택 정렬에 대한 위키피디아 문서:
컴퓨터 과학에서 선택 정렬은 정렬 알고리즘, 특히 임플레이스 비교 정렬입니다.O(n2)의 시간 복잡도를 가지기 때문에 대규모 목록에서 비효율적이며 일반적으로 유사한 삽입 정렬보다 성능이 떨어집니다.선택 정렬은 단순성이 뛰어나며 특히 보조 메모리가 제한된 상황에서는 더 복잡한 알고리즘에 비해 성능이 우수합니다.
function selectionSort(array $array) {
$length = count($array);
for($i = 0; $i < $length; $i ++) {
$min = $i;
for($j = $i + 1; $j < $length; $j ++) {
if ($array[$j] < $array[$min]) {
$min = $j;
}
}
$tmp = $array[$min];
$array[$min] = $array[$i];
$array[$i] = $tmp;
}
return $array;
}
삽입 정렬
삽입 정렬에 대한 Wikipedia 문서:
삽입 정렬은 최종 정렬된 배열(또는 목록)을 한 번에 하나씩 작성하는 단순한 정렬 알고리즘입니다.퀵소트, 힙소트 또는 머지 정렬과 같은 고급 알고리즘에 비해 대규모 목록에서 훨씬 덜 효율적입니다.단, 삽입 정렬에는 다음과 같은 장점이 있습니다.
function insertionSort(array $array) {
$count = count($array);
for($i = 1; $i < $count; $i ++) {
$j = $i - 1;
// second element of the array
$element = $array[$i];
while ( $j >= 0 && $array[$j] > $element ) {
$array[$j + 1] = $array[$j];
$array[$j] = $element;
$j = $j - 1;
}
}
return $array;
}
셸소트
셸 정렬 또는 셸 메서드라고도 하는 셸 정렬은 인플레이스 비교 정렬입니다.인접 요소를 종료하기 전에 멀리 떨어져 있는 요소와의 비교 및 교환을 시작하여 삽입 또는 버블 정렬과 같은 교환 정렬을 일반화합니다.
function shellSort(array $array) {
$gaps = array(
1,
2,
3,
4,
6
);
$gap = array_pop($gaps);
$length = count($array);
while ( $gap > 0 ) {
for($i = $gap; $i < $length; $i ++) {
$tmp = $array[$i];
$j = $i;
while ( $j >= $gap && $array[$j - $gap] > $tmp ) {
$array[$j] = $array[$j - $gap];
$j -= $gap;
}
$array[$j] = $tmp;
}
$gap = array_pop($gaps);
}
return $array;
}
빗살 정렬
빗 정렬은 1980년에 Wlodzimierz Dobosiewicz가 고안한 비교적 단순한 정렬 알고리즘입니다.나중에 그것은 1991년 Stephen Lacey와 Richard Box에 의해 재발견되었다.빗살 정렬은 버블 정렬에서 개선됩니다.
function combSort(array $array) {
$gap = count($array);
$swap = true;
while ( $gap > 1 || $swap ) {
if ($gap > 1)
$gap /= 1.25;
$swap = false;
$i = 0;
while ( $i + $gap < count($array) ) {
if ($array[$i] > $array[$i + $gap]) {
// swapping the elements.
list($array[$i], $array[$i + $gap]) = array(
$array[$i + $gap],
$array[$i]
);
$swap = true;
}
$i ++;
}
}
return $array;
}
병합 정렬
병합 정렬에 대한 Wikipedia 문서:
컴퓨터 과학에서 병합 정렬(일반적으로 mergesort라고도 함)은 O(n log n) 비교 기반 정렬 알고리즘입니다.대부분의 구현은 안정적인 정렬을 생성합니다. 즉, 구현은 정렬된 출력에서 동일한 요소의 입력 순서를 유지합니다.
function mergeSort(array $array) {
if (count($array) <= 1)
return $array;
$left = mergeSort(array_splice($array, floor(count($array) / 2)));
$right = mergeSort($array);
$result = array();
while ( count($left) > 0 && count($right) > 0 ) {
if ($left[0] <= $right[0]) {
array_push($result, array_shift($left));
} else {
array_push($result, array_shift($right));
}
}
while ( count($left) > 0 )
array_push($result, array_shift($left));
while ( count($right) > 0 )
array_push($result, array_shift($right));
return $result;
}
퀵소트
Quicksort에 대한 위키피디아 기사:
QuickSort 또는 파티션 교환 정렬은 평균적으로 O(n log n) 비교를 통해 n개의 항목을 정렬하는 정렬 알고리즘입니다.최악의 경우 O(n2) 비교를 합니다만, 이 동작은 거의 없습니다.
function quickSort(array $array) {
if (count($array) == 0) {
return $array;
}
$pivot = $array[0];
$left = $right = array();
for($i = 1; $i < count($array); $i ++) {
if ($array[$i] < $pivot) {
$left[] = $array[$i];
} else {
$right[] = $array[$i];
}
}
return array_merge(quickSort($left), array(
$pivot
), quickSort($right));
}
치환 정렬
순열 정렬에 대한 위키피디아 문서:
순열 정렬 - 정렬된 배열/목록을 검색할 때까지 입력 배열/목록의 가능한 순열을 생성하여 계속 진행합니다.
function permutationSort($items, $perms = array()) {
if (empty($items)) {
if (inOrder($perms)) {
return $perms;
}
} else {
for($i = count($items) - 1; $i >= 0; -- $i) {
$newitems = $items;
$newperms = $perms;
list($foo) = array_splice($newitems, $i, 1);
array_unshift($newperms, $foo);
$res = permutationSort($newitems, $newperms);
if ($res) {
return $res;
}
}
}
}
function inOrder($array) {
for($i = 0; $i < count($array); $i ++) {
if (isset($array[$i + 1])) {
if ($array[$i] > $array[$i + 1]) {
return False;
}
}
}
return True;
}
기수 정렬
컴퓨터 과학에서 기수 정렬은 동일한 유의한 위치와 값을 공유하는 개별 자릿수를 기준으로 키를 그룹화하여 정수 키로 데이터를 정렬하는 비교되지 않는 정수 정렬 알고리즘입니다.
// Radix Sort for 0 to 256
function radixSort($array) {
$n = count($array);
$partition = array();
for($slot = 0; $slot < 256; ++ $slot) {
$partition[] = array();
}
for($i = 0; $i < $n; ++ $i) {
$partition[$array[$i]->age & 0xFF][] = &$array[$i];
}
$i = 0;
for($slot = 0; $slot < 256; ++ $slot) {
for($j = 0, $n = count($partition[$slot]); $j < $n; ++ $j) {
$array[$i ++] = &$partition[$slot][$j];
}
}
return $array;
}
안정된 정렬
예를 들어 다음과 같은 어레이가 있다고 가정합니다.
['Kale', 'Kaleidoscope', 'Aardvark', 'Apple', 'Leicester', 'Lovely']
이제 첫 번째 문자만 정렬하려고 합니다.
usort($array, function($a, $b) {
return strcmp($a[0], $b[0]);
});
결과는 다음과 같습니다.
['Apple', 'Aardvark', 'Kale', 'Kaleidoscope', 'Lovely', 'Leicester']
안정적이지 못한 종류였어!
예리한 관찰자는 배열 정렬 알고리즘(QuickSort)이 안정적인 결과를 내지 못하고 동일한 첫 글자의 단어 사이의 원래 순서가 유지되지 않은 것을 알아차렸을 수 있습니다.이 경우는 사소한 일이기 때문에 문자열 전체를 비교했어야 하는데, 예를 들어 서로 다른 필드에서 두 개의 연속된 정렬이 서로의 작업을 취소해서는 안 되는 등 사용 사례가 더 복잡하다고 가정해 보겠습니다.
슈워츠의 변혁
decorate-sort-undecorate idiod라고도 불리는 Schwartzian 변환은 본질적으로 불안정한 정렬 알고리즘으로 안정적인 정렬에 영향을 줍니다.
먼저 기본 키(값)와 보조 키(색인 또는 위치)로 구성된 다른 배열로 각 배열 요소를 꾸밉니다.
array_walk($array, function(&$element, $index) {
$element = array($element, $index); // decorate
});
그러면 어레이가 다음과 같이 변환됩니다.
[
['Kale', 0], ['Kaleidoscope', 1],
['Aardvark', 2], ['Apple', 3],
['Leicester', 4], ['Lovely', 5]
]
이제 비교 단계를 조정하고 첫 번째 문자를 다시 비교합니다. 그러나 같은 경우 보조 키를 사용하여 원래 순서를 유지합니다.
usort($array, function($a, $b) {
// $a[0] and $b[0] contain the primary sort key
// $a[1] and $b[1] contain the secondary sort key
$tmp = strcmp($a[0][0], $b[0][0]);
if ($tmp != 0) {
return $tmp; // use primary key comparison results
}
return $a[1] - $b[1]; // use secondary key
});
그 후 디코딩을 해제합니다.
array_walk($array, function(&$element) {
$element = $element[0];
});
최종 결과:
['Aardvark', 'Apple', 'Kale', 'Kaleidoscope', 'Leicester', 'Lovely']
재사용은 어떨까요?
변환된 어레이 요소를 사용하기 위해 비교 함수를 다시 작성해야 했습니다. 섬세한 비교 함수를 편집하고 싶지 않을 수도 있습니다.이러한 비교 함수는 다음과 같습니다.
function stablecmp($fn)
{
return function($a, $b) use ($fn) {
if (($tmp = call_user_func($fn, $a[0], $b[0])) != 0) {
return $tmp;
} else {
return $a[1] - $b[1];
}
};
}
다음 함수를 사용하여 정렬 단계를 작성합니다.
usort($array, stablecmp(function($a, $b) {
return strcmp($a[0], $b[0]);
}));
보일라! 너의 순수한 비교 코드가 돌아왔다.
폐색 포함 PHP 5.3에서는 폐색 사용도 가능합니다.
예를 들어 $array가 월 속성을 포함하는 개체의 배열이라고 가정합니다.
$orderArray = array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec");
usort($array, function($a, $b) use ($orderArray){
return array_search($a->month, $orderArray) - array_search($b->month, $orderArray);
});
LINQ
.NET에서는 LINQ를 정렬에 자주 사용합니다.이것에 의해, 특히 오브젝트를 복수의 필드로 정렬할 필요가 있는 경우는, 비교 함수보다 훨씬 뛰어난 구문을 얻을 수 있습니다.YaLinqo 라이브러리*를 포함하여 LINQ에서 PHP로 연결되는 여러 포트가 있습니다.이를 통해 복잡한 비교 함수를 작성하지 않고도 어레이를 한 줄로 정렬할 수 있습니다.
$sortedByName = from($objects)->orderBy('$v->name');
$sortedByCount = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
비교는 두 번째 인수로 콜백을 전달함으로써 커스터마이즈할 수 있습니다.다음은 예를 제시하겠습니다.
$sortedByFilenameNat = from($objects)->orderBy('$v->filename', 'strnatcmp');
서서,,'$v->count'
function ($v) { return $v->count; }
(어느 쪽이든)반환합니다.하려면 , 「반복기」를 추가합니다.리터레이터를 어레이로 변환하려면->toArray()
결국엔 필요하게 될 거야.
intern적 intern intern internorderBy
함수를 합니다(배열 정렬 함수uasort
,krsort
,multisort
,usort
을 사용하다
LINQ에는 SQL에서 영감을 받은 필터링, 그룹화, 결합, 집약 등 더 많은 메서드가 포함되어 있습니다.이 솔루션은 데이터베이스에 의존하지 않고 어레이 및 개체에 대해 복잡한 변환을 수행해야 하는 경우에 가장 적합합니다.
* 자체 개발. 자세한 내용과 다른 LINQ 포트와의 비교는 readme를 참조하십시오.
키 값별 다차원 정렬
키 값에 의한 자연스러운 다차원 배열로 원래 순서를 유지합니다(메인 키를 섞지 마십시오).
function multisortByKeyValue( $k, $arr ) {
$ids = array();
$index = 1;
foreach ( $arr as $key => $row ) {
$ids[ $key ] = intval( $row[ $k ] ) . '-' . $index . '-' . $key;
$index ++;
}
natsort( $ids );
$arr = array_merge( $ids, $arr );
return $arr;
}
테스트 케이스:
$arr = array(
'id1' => array(
'label' => 'ID 1',
'priority' => 30,
),
'id2' => array(
'label' => 'ID 2',
'priority' => 70,
),
'id3' => array(
'label' => 'ID 3',
'priority' => 20,
),
'id4' => array(
'label' => 'ID 4',
'priority' => 30,
),
);
$sorted = multisortByKeyValue( 'priority', $arr );
// $sorted equals to:
/*
array (
'id3' => array (
'label' => 'ID 3',
'priority' => 20,
),
'id1' => array (
'label' => 'ID 1',
'priority' => 30,
),
'id4' => array (
'label' => 'ID 4',
'priority' => 30,
),
'id2' => array (
'label' => 'ID 2',
'priority' => 70,
),
)
*/
Nspl에서 정렬된 함수를 사용하여 배열 정렬이 매우 편리합니다.
기본 정렬
// Sort array
$sorted = sorted([3, 1, 2]);
// Sort array in descending order
$sortedDesc = sorted([3, 1, 2], true);
함수 결과별 정렬
// Sort array by the result of a given function (order words by length)
$sortedByLength = sorted(['bc', 'a', 'abc'], 'strlen');
$sortedByLengthDesc = sorted(['bc', 'a', 'abc'], true, 'strlen');
// Sort array by the result of user-defined function (order words by the 1st character)
$sortedByTheFirstCharacter = sorted(['bc', 'a', 'abc'], function($v) { return $v[0]; });
// Which is the same as
$sortedByTheFirstCharacter = sorted(['bc', 'a', 'abc'], itemGetter(0));
$sortedByTheFirstCharacterDesc = sorted(['bc', 'a', 'abc'], true, itemGetter(0));
// itemGetter(0) returns a function which takes an argument with access by index/key
// and returns the value at index 0
다차원 배열 정렬
// Sort multidimensional array (sort list of users by their names)
$users = [
array('name' => 'Robert', 'age' => 20),
array('name' => 'Alex', 'age' => 30),
array('name' => 'Jack', 'age' => 25),
];
$sortedByName = sorted($users, itemGetter('name'));
$sortedByNameDesc = sorted($users, true, itemGetter('name'));
// itemGetter('name') returns a function which takes an argument with access by index/key
// and returns the value of the 'name' key
개체 배열 정렬 중
// Lets assume we have class User(name, age) with properties name and age
// and public methods getName() and getAge()
$users = [
new User('Robert', 20),
new User('Alex', 30),
new User('Jack', 25),
];
// Sort list of objects by property value (sort list of users by their name)
$sortedByName = sorted($users, propertyGetter('name'));
$sortedByNameDesc = sorted($users, true, propertyGetter('name'));
// propertyGetter('name') returns a function which takes an object
// and returns the value of its 'name' property
// Sort list of objects by method result (sort list of users by their age)
$sortedByAge = sorted($users, methodCaller('getAge'));
$sortedByAgeDesc = sorted($users, true, methodCaller('getAge'));
// methodCaller('getAge') returns a function which takes an object
// and returns the result of its getAge() method
비교 기능으로 정렬
// Sort with a comparison function (order words lexicographically with strcmp)
$sortedLexicographically = sorted(['bc', 'a', 'abc'], false, null, 'strcmp');
// Sort with user-defined comparison function (order words by the 1st character)
$sortedByTheFirstCharacter = sorted(['bc', 'a', 'abc'], false, null, function($v1, $v2) {
return chr($v1[0]) - chr($v2[0]);
});
여기서 모든 예를 볼 수 있습니다.
키 값으로 주문하고 싶다면 우아하고 명료하게 한 줄로 주문하면 됩니다.가격 오름차순으로 주문하겠습니다.array_multisort 및 array_column을 사용합니다.
Array([0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => coffee [price] => 9.99 ) [2] => Array ( [name] => rice [price] => 4.04 ) )
array_multisort (array_column($array, 'price'), SORT_ASC, $array);
생산하다
Array ( [0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => rice [price] => 4.04 ) [2] => Array ( [name] => coffee [price] => 9.99 ) )
이 페이지는 매우 포괄적입니다만, 우주선의 오퍼레이터(삼원 비교 오퍼레이터)의 훌륭한 유틸리티에 대해 조금 더 덧붙이고 싶습니다.PHP7+의 아름다운 아이입니다.
우주선 오퍼레이터를 사용하여 여러 정렬 조건 구현
이것은 코드 블러트를 줄이고 가독성을 향상시키는 데 큰 진전을 이뤘다.
정렬을 때( 「 」 「 」 「 。usort()
/uasort()
/uksort()
) 함수를 사용하면 여러 조건을 처리할 수 있습니다.오퍼레이터의 양쪽에 균형 잡힌 배열을 쓰고 결과를 반환하기만 하면 됩니다.더 이상 중첩된 조건 블록 또는 다중 반환이 없습니다.
연산자 양쪽의 요소는 한 번에 하나씩 왼쪽에서 오른쪽으로 이동하며, 비타이가 발견되거나 요소가 모두 비교되면 바로 평가가 반환됩니다.
데모용 샘플 데이터:
$multidimArray = [
'a' => [
'boolean' => true,
'natString' => 'text10',
'object' => (object)['prop' => 2],
'float' => -.5,
'mixed' => []
],
'b' => [
'boolean' => true,
'natString' => 'text12',
'object' => (object)['prop' => 4],
'float' => 0,
'mixed' => null
],
'c' => [
'boolean' => false,
'natString' => 'text100',
'object' => (object)['prop' => 9],
'float' => -.5,
'mixed' => false
],
'd' => [
'boolean' => true,
'natString' => 'text1',
'object' => (object)['prop' => 9],
'float' => -5,
'mixed' => "\0"
],
'e' => [
'boolean' => false,
'natString' => 'text2',
'object' => (object)['prop' => 2],
'float' => .5,
'mixed' => ''
]
];
데모(Stackoverflow 페이지 팽창을 방지하려면 출력 데모 링크를 참조하십시오):
정렬 로직:
- 부울 DESC(false = 0, true = 1이므로 false 전에 true)
플로트 ASC
uasort($multidimArray, function($a, $b) { return [$b['boolean'], $a['float']] <=> [$a['boolean'], $b['float']]; });
정렬 로직:
- 혼합 ASC
- 오브젝트 ASC
부울 ASC
uasort($multidimArray, function($a, $b) { return [$a['mixed'], $a['object']->prop, $a['boolean']] <=> [$b['mixed'], $b['object']->prop, $b['boolean']]; });
정렬 로직:
- 오브젝트 ASC 속성 수
- 혼합 DESC의 반복성
- natString 길이 ASC
natString ASC
uasort($multidimArray, function($a, $b) { return [count(get_object_vars($a['object'])), is_iterable($a['mixed']), strlen($a['natString']), $a['natString']] <=> [count(get_object_vars($b['object'])), is_iterable($b['mixed']), strlen($b['natString']), $b['natString']]; });
이 구문을 사용하면 값, 기능 결과, 깊이 내포된 데이터 및 정렬 방향을 우아하게 정렬할 수 있습니다.이것은 확실히 당신의 php 툴벨트에 넣을 가치가 있습니다.데이터베이스 이외의 데이터를 처리하는 경우 SQL이 훨씬 더 합리적인 기술이기 때문입니다.
PHP7.4 에서는, 이러한 익명 함수와 함께 화살표 구문을 사용할 수 있습니다.화살표 구문을 사용하는 동일한 스크립트.
여러 기준에 따라 어레이를 가장 높은 값에 따라 정렬하려면 다음과 같이 하십시오.
usort($arr, function($item, $nextItem) {
return (max($nextItem->firstNumber, $nextItem->secondNumber)) - (max($item->firstNumber, $item->secondNumber));
});
예:
$foo = new stdClass;
$foo->createdDate = '10';
$foo->uploadedDate = '5';
$bar = new stdClass;
$bar->createdDate = '1';
$bar->uploadedDate = '12';
$baz = new stdClass;
$baz->createdDate = '25';
$baz->uploadedDate = '0';
$arr = [$foo, $bar, $baz];
// Order array by the highest number between "createdDate" and "uploadedDate".
usort($arr, function($item, $nextItem) {
return (max($nextItem->createdDate, $nextItem->uploadedDate)) - (max($item->createdDate, $item->uploadedDate));
});
결과:
array (
0 =>
(object) array(
'createdDate' => '25',
'uploadedDate' => '0',
),
1 =>
(object) array(
'createdDate' => '1',
'uploadedDate' => '12',
),
2 =>
(object) array(
'createdDate' => '10',
'uploadedDate' => '5',
),
)
이 답변은 연속되지 않은 인덱스의 값을 기준으로 배열이 정렬되어야 하는 다중 열 정렬에 대한 것입니다.이것은 각 요소가 다양한 Key=> Value 쌍으로만 구성되어 있기 때문에 다차원 정렬과는 다릅니다.
function fncCmp( array $ItmOne, array $ItmTwo ) { ; # callback for sorting items (which are arrays) by values at specific indexes
$strCmpOne = $ItmOne[ 'ColOne' ] . $ItmOne[ 'ColThr' ]; # build compound values
$strCmpTwo = $ItmTwo[ 'ColOne' ] . $ItmTwo[ 'ColThr' ]; # to compare
return $strCmpOne <=> $strCmpTwo ; # pass back comparison-result
} # fncCmp
$arrDat = array( # define an array of items
array( 'ColOne' => 'Val2', 'ColTwo' => 'Val8', 'ColThr' => 'Val6' ) # each of which
,array( 'ColOne' => 'Val2', 'ColTwo' => 'Val9', 'ColThr' => 'Val4' ) # is an
,array( 'ColOne' => 'Val1', 'ColTwo' => 'Val7', 'ColThr' => 'Val5' ) # array of
) ; # fields
var_dump ( $arrDat ) ; # emit items before sort
$bolSrt = usort( $arrDat, 'fncCmp' ) ; # sort the array by comparing elements
var_dump ( $arrDat ) ; # emit items after sort
배열 정렬에는 여러 가지 방법이 있습니다.저는 그 일을 하는 방법을 몇 가지 언급하겠습니다.우선 '$numbers'라고 하는 정수 배열을 지정합니다.
$number = array(8,9,3,4,0,1,2);
이것은 어레이를 작성하는 일반적인 방법입니다.예를 들어, 배열을 오름차순으로 정렬합니다.그러기 위해서는 'sort()' 메서드를 사용할 수 있습니다.
<?php
$number = array(8,9,3,4,0,1,2);
sort($number);
foreach ($number as $value) {
echo $value." ";
}
?>
이제 그 결과를 생각해 보세요
인쇄 번호 배열이 정렬되어 있는 것을 알 수 있습니다.이 번호 배열을 내림차순으로 정렬하려면 해당 작업에 'rsort()' 메서드를 사용할 수 있습니다.
<?php
$number = array(8,9,3,4,0,1,2);
rsort($number);
foreach ($number as $value) {
echo $value." ";
}
?>
출력을 고려하다
이제 배열이 내림차순으로 정렬됩니다.자, 연관 배열에 대해 생각해 봅시다.이와 같이 연관 배열(관련 배열은 각 인덱스가 고유한 키 값을 갖는 배열)을 지정합니다.
$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
이 배열을 값에 따라 오름차순으로 정렬합니다.'asort()' 메서드를 사용할 수 있습니다.
<?php
$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
asort($number);
foreach ($number as $value) {
echo $value." ";
}
?>
내림차순을 값에 따라 정렬할 경우 'arsort()' 메서드를 사용할 수 있습니다.키 값에 따라 배열을 정렬한다고 가정합니다.이 경우 'ksort()' 메서드를 사용할 수 있습니다.
<?php
$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
ksort($number);
foreach ($number as $value) {
echo $value." ";
}
?>
이제 어레이는 키 값에 따라 정렬됩니다.키 값에 따라 배열을 내림차순으로 정렬하려면 'krsort()' 메서드를 사용할 수 있습니다.
<?php
$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
krsort($number);
foreach ($number as $value) {
echo $value." ";
}
?>
이제 연관 배열이 키 값에 따라 내림차순으로 정렬됩니다.출력을 보세요.
다음은 php에서 오름차순 또는 내림차순으로 배열 정렬하는 몇 가지 방법입니다.좋은 생각이 떠올랐으면 좋겠어요.감사해요!
어레이를 조작하기 위한 보다 심플한 솔루션을 필요로 하는 경우는, 키를 사용해 간단하게 정렬할 수 있는 sortBy 기능이 실장되어 있는 Larabel Collection 패키지를 사용해 주세요.
$collection->sortBy('forename')->sortBy('surname');
즉, 먼저 a, b, c로 정렬하려면 올바른 절은 다음과 같습니다.
sortBy('c')->sortBy('b')->sortBy('a')
https://packagist.org/packages/tightenco/collect
가장 간단한 방법은 usort 함수를 사용하여 루프 없이 배열을 정렬하는 것입니다.다음은 예를 제시하겠습니다.
$array_compare= array("0" =>4,"1"=>2,"2"=>500,"3"=>100);
그러면 원하는 순서대로 정렬됩니다.
usort($array_compare, function($a, $b) {
return ($b['x1'] - $a['x1']) > 0 ? 1 :-1;
});
그러면 다음 순서로 정렬됩니다.
usort($array_compare, function($a, $b) {
return ($b['x1'] - $a['x1']) < 0 ? 1 :-1;
});
언급URL : https://stackoverflow.com/questions/17364127/how-can-i-sort-arrays-and-data-in-php
'programing' 카테고리의 다른 글
특정 회선에 대한 eslint 규칙 해제 (0) | 2023.01.31 |
---|---|
현재 시간(밀리초)을 PHP로 가져오는 방법 (0) | 2023.01.31 |
PHP를 사용하여 JQuery .ajax()에 대한 적절한 성공/오류 메시지를 반환하려면 어떻게 해야 합니까? (0) | 2023.01.31 |
JavaScript를 사용한 이미지 프리로드 (0) | 2023.01.31 |
SELECT 내에서 여러 CASE 콜을 심플화 (0) | 2023.01.31 |