etc./StackOverFlow

값을 기준으로 다차원 배열을 정렬하는 방법

청렴결백한 만능 재주꾼 2023. 4. 26. 12:46
반응형

질문자 :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 Studer

function 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.K

array_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 ; });

jspit

usort 및 사용자 정의 정렬 함수를 사용할 수 있습니다.

 usort($new, fn($a, $b) => $a['order'] - $b['order']);

트릭: 오름차순으로 정렬 a > b 또는 a - b 또는 a <=> b 를 사용할 수 있습니다. 내림차순 ab 의 스왑 위치.


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

반응형