질문자 :stef
이 배열을 "order" 키 값으로 정렬하려면 어떻게 해야 합니까?
값이 현재 순차적이지만 항상 그런 것은 아닙니다.
Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) )
usort를 시도하십시오. 아직 PHP 5.2 또는 이전 버전을 사용 중이라면 먼저 정렬 함수를 정의해야 합니다.
function sortByOrder($a, $b) { return $a['order'] - $b['order']; } usort($myArray, 'sortByOrder');
PHP 5.3부터 익명 함수를 사용할 수 있습니다.
usort($myArray, function($a, $b) { return $a['order'] - $b['order']; });
마지막으로 PHP 7에서는 우주선 연산자를 사용할 수 있습니다.
usort($myArray, function($a, $b) { return $a['order'] <=> $b['order']; });
이것을 다차원 정렬로 확장하려면 첫 번째가 0인 경우 두 번째/세 번째 정렬 요소를 참조하십시오(아래에서 가장 잘 설명됨). 하위 요소를 정렬하는 데 사용할 수도 있습니다.
usort($myArray, function($a, $b) { $retval = $a['order'] <=> $b['order']; if ($retval == 0) { $retval = $a['suborder'] <=> $b['suborder']; if ($retval == 0) { $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder']; } } return $retval; });
키 연관을 유지해야 하는 경우 uasort()
사용하십시오. 매뉴얼에서 배열 정렬 기능 비교를 참조하십시오.
Christian Studerfunction aasort (&$array, $key) { $sorter = array(); $ret = array(); reset($array); foreach ($array as $ii => $va) { $sorter[$ii] = $va[$key]; } asort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii] = $array[$ii]; } $array = $ret; } aasort($your_array, "order");
o0'.나는이 기능을 사용합니다 :
function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) { $sort_col = array(); foreach ($arr as $key => $row) { $sort_col[$key] = $row[$col]; } array_multisort($sort_col, $dir, $arr); } array_sort_by_column($array, 'order');
편집 이 답변은 적어도 10년이 지났고 지금은 더 나은 솔루션이 있을 수 있지만 몇 가지 의견에서 요청한 대로 몇 가지 추가 정보를 추가하고 있습니다.
array_multisort()
가 여러 배열을 정렬할 수 있기 때문에 작동합니다. 예시 입력:
Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 )
첫 번째 $sort_col
은 정렬 기준이 되는 값과 입력 배열과 일치하는 키가 있는 2차원 배열입니다. 예를 들어 이 입력의 경우 $sort_col
"order"
키를 선택하면 다음을 얻습니다.
Array ( [0] => 3, [1] => 2 )
array_multisort()
는 해당 배열을 정렬하지만(키 순서 1, 0
) 이것은 2차원 배열일 뿐입니다. 따라서 원래 입력 배열도 $rest
인수로 전달됩니다. 키가 일치하면 키도 같은 순서로 정렬되어 원하는 결과를 얻을 수 있습니다.
메모:
- 제공된 배열이 제자리에서 수정되도록 참조로 전달됩니다.
-
array_multisort()
는 하나가 아닌 이와 같이 여러 개의 추가 배열을 정렬할 수 있습니다.
Tom Haigh이를 달성하기 위해 '다중 또는 다차원 배열을 정렬'하는 "array_multisort" 메서드를 사용할 수 있습니다. 메소드 매개변수는
- $keys - 정렬되는 배열
- SORT_ASC - 정렬 순서(오름차순)
- 정렬 플래그(일반적으로 항목을 비교(유형을 변경하지 않음) 또는 숫자로 또는 문자열로 비교)
- $new - 나머지 배열. 이전의 동등한 요소에 해당하는 요소만
배열이 비교됩니다.
'sort flags'는 기본적으로 SORT_REGULAR이며 생략됩니다.
$new = [ [ 'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4', 'title' => 'Flower', 'order' => 3, ], [ 'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594', 'title' => 'Free', 'order' => 2, ], [ 'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b', 'title' => 'Ready', 'order' => 1, ], ]; $keys = array_column($new, 'order'); array_multisort($keys, SORT_ASC, $new); var_dump($new);
결과:
Array ( [0] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) )
ajuchacko91나는 보통 usort를 사용하고 내 자신의 비교 기능을 전달합니다. 이 경우 매우 간단합니다.
function compareOrder($a, $b) { return $a['order'] - $b['order']; } usort($array, 'compareOrder');
우주선 연산자를 사용하는 PHP 7:
usort($array, function($a, $b) { return $a['order'] <=> $b['order']; });
Jan Fabry"제목" 키 값으로 배열을 정렬하려면 다음을 사용하십시오.
uasort($myArray, function($a, $b) { return strcmp($a['title'], $b['title']); });
strcmp 는 문자열을 비교합니다.
uasort() 는 정의된 배열 키를 유지합니다.
B.Karray_multisort()
, array_map()
array_multisort(array_map(function($element) { return $element['order']; }, $array), SORT_ASC, $array); print_r($array);
데모
Ghanshyam Nakiya$sort = array(); $array_lowercase = array_map('strtolower', $array_to_be_sorted); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
이것은 대문자와 소문자 알파벳을 모두 처리합니다.
Nitrodbz가장 유연한 접근 방식은 다음 방법을 사용하는 것입니다.
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
이유는 다음과 같습니다.
모든 키를 기준으로 정렬할 수 있습니다( 'key1.key2.key3'
또는 ['k1', 'k2', 'k3']
과 같이 중첩됨).
연관 배열과 비 연관 배열 모두에서 작동합니다( $assoc
플래그).
참조를 사용하지 않습니다 - 새로운 정렬된 배열을 반환합니다
귀하의 경우 다음과 같이 간단합니다.
$sortedArray = Arr::sortByKeys($array, 'order');
이 메소드는 이 라이브러리 의 일부입니다.
Minwork키에 따라 정렬해야 하는 사람이 있는 경우 다음을 사용하는 것이 가장 좋습니다.
usort($array, build_sorter('order')); function build_sorter($key) { return function ($a, $b) use ($key) { return strnatcmp($a[$key], $b[$key]); }; }
Zahid그냥 해, 버전 7.4 이상에서 작동
uasort($yourArray,fn($prev,$now)=>$prev['order']<=>$now['order']);
예쁜 프린트
echo '<pre>'; print_r($yourArray);
dılo sürücü이 솔루션은 다차원 정렬을 위해 기억하기 쉬운 표기법을 사용하는 usort()를 위한 것입니다. PHP 7에서 사용할 수 있는 우주선 연산자 <=>가 사용됩니다.
usort($in,function($a,$b){ return $a['first'] <=> $b['first'] //first asc ?: $a['second'] <=> $b['second'] //second asc ?: $b['third'] <=> $a['third'] //third desc (ab swapped!) //etc ; });
예:
$in = [ ['firstname' => 'Anton', 'surname' => 'Gruber', 'birthdate' => '03.08.1967', 'rank' => 3], ['firstname' => 'Anna', 'surname' => 'Egger', 'birthdate' => '04.01.1960', 'rank' => 1], ['firstname' => 'Paul', 'surname' => 'Mueller', 'birthdate' => '15.10.1971', 'rank' => 2], ['firstname' => 'Marie', 'surname' => 'Schmidt ', 'birthdate' => '24.12.1963', 'rank' => 2], ['firstname' => 'Emma', 'surname' => 'Mueller', 'birthdate' => '23.11.1969', 'rank' => 2], ];
첫 번째 작업: 순위 오름차순, 성 오름차순 정렬
usort($in,function($a,$b){ return $a['rank'] <=> $b['rank'] //first asc ?: $a['surname'] <=> $b['surname'] //second asc ; });
두 번째 작업: rank desc, 성 asc, firstmame asc 순으로 정렬
usort($in,function($a,$b){ return $b['rank'] <=> $a['rank'] //first desc ?: $a['surname'] <=> $b['surname'] //second asc ?: $a['firstname'] <=> $b['firstname'] //third asc ; });
세 번째 작업: 순위 내림차순, 생년월일 오름차순 정렬
이 표기법에서는 날짜를 정렬할 수 없습니다. strtotime으로 변환됩니다.
usort($in,function($a,$b){ return $b['rank'] <=> $a['rank'] //first desc ?: strtotime($a['birthdate']) <=> strtotime($b['birthdate']) //second asc ; });
jspitusort
및 사용자 정의 정렬 함수를 사용할 수 있습니다.
usort($new, fn($a, $b) => $a['order'] - $b['order']);
트릭: 오름차순으로 정렬 a > b
또는 a - b
또는 a <=> b
를 사용할 수 있습니다. 내림차순 a
및 b
의 스왑 위치.
Mehdi Taher사실을 직시하자. PHP에는 모든 배열 정렬 시나리오를 적절하게 처리하는 즉시 사용 가능한 간단한 기능 이 없습니다.
이 루틴은 직관적이므로 디버깅 및 유지 관리가 더 빨라집니다.
// Automatic population of the array $tempArray = array(); $annotations = array(); // ... some code // SQL $sql retrieves result array $result // $row[0] is the ID, but is populated out of order (comes from // multiple selects populating various dimensions for the same DATE // for example while($row = mysql_fetch_array($result)) { $needle = $row[0]; arrayIndexes($needle); // Create a parallel array with IDs only $annotations[$needle]['someDimension'] = $row[1]; // Whatever } asort($tempArray); foreach ($tempArray as $arrayKey) { $dataInOrder = $annotations[$arrayKey]['someDimension']; // .... more code } function arrayIndexes ($needle) { global $tempArray; if (!in_array($needle, $tempArray)) { array_push($tempArray, $needle); } }
tony gil출처 : http:www.stackoverflow.com/questions/2699086/how-to-sort-a-multi-dimensional-array-by-value