값을 기준으로 다차원 어레이를 정렬하는 방법
이 어레이를 "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
)
)
이용하다.아직 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'];
});
마지막으로, PHP 7.4에서는 화살표 기능으로 비트를 정리할 수 있습니다.
usort($myArray, fn($a, $b) => $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()
- 매뉴얼에서 배열 정렬 기능 비교를 참조하십시오.
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");
다음 기능을 사용합니다.
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차원 배열입니다. 입력 라서음음음음음음음음음음음음음음음음음 the the the the the 됩니다.$rest
같은 결과를 수 .키가 일치하면 키도 같은 순서로 정렬되어 원하는 결과를 얻을 수 있습니다.
주의:
- 제공된 배열이 수정되도록 참조에 의해 전달됩니다.
array_multisort()
의 어레이가 , 할 수 있습니다.
이를 위해서는 '복수 또는 다차원 배열 정렬' 방식을 사용할 수 있습니다.메서드 파라미터는
- $keys - 정렬되는 배열
- SORT_ASC - 정렬 순서(오름차순)
- 정렬 플래그(일반적으로 항목(유형을 변경하지 않음) 또는 숫자 또는 문자열로 정렬)
- $new - "신규"의 동등한
어레이를 비교합니다.
'sort flags'는 기본적으로 SORT_REGUAL이며 생략됩니다.
$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
)
)
저는 주로 유소르트를 사용하고, 저만의 비교 기능을 통과합니다.이 경우 매우 간단합니다.
function compareOrder($a, $b)
{
return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
우주선 연산자를 사용하는 PHP 7에서:
usort($array, function($a, $b) {
return $a['order'] <=> $b['order'];
});
배열을 "title" 키 값으로 정렬하려면 다음을 사용합니다.
uasort($myArray, function($a, $b) {
return strcmp($a['title'], $b['title']);
});
strcmp는 문자열을 비교합니다.
uasort()는 정의된 대로 배열 키를 유지합니다.
사용하다array_multisort()
,array_map()
array_multisort(array_map(function($element) {
return $element['order'];
}, $array), SORT_ASC, $array);
print_r($array);
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
이렇게 하면 대문자와 소문자가 모두 처리됩니다.
가장 유연한 접근방식은 다음 방법을 사용하는 것입니다.
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
이유는 다음과 같습니다.
임의의 키로 정렬할 수 있습니다(또한 다음과 같이 중첩됨).
'key1.key2.key3'
또는['k1', 'k2', 'k3']
)어소시에이티브 어레이와 비어소시에이티브 어레이 모두에서 동작합니다).
$assoc
플래그)참조를 사용하지 않고 정렬된 새 배열이 반환됩니다.
고객님의 경우 다음과 같이 간단합니다.
$sortedArray = Arr::sortByKeys($array, 'order');
이 메서드는 이 라이브러리의 일부입니다.
PHP 7.4 이상에서 작동하는 "화살표 함수" 구문:
uasort($yourArray, fn($a, $b) => $a['order'] <=> $b['order']);
예쁜 활자
echo '<pre>';
print_r($yourArray);
승인된 답변에 따라 다음을 사용할 수 있습니다.
usort($myArray, function($a, $b) {
return $a['order'] <=> $b['order'];
});
둘 이상의 열을 기준으로 정렬해야 하는 경우 다음을 수행합니다.
usort($myArray, function($a, $b) {
return [$a['column1'],$a['column2']] <=> [$b['column1'],$b['column2']];
});
이 값은 데이터의 열 수에 관계없이 확장할 수 있습니다.이는 PHP에서 어레이를 직접 비교할 수 있다는 사실에 의존합니다.위의 예에서는 먼저 어레이를 정렬합니다.column1
그리고 나서column2
단, 다음과 같은 임의의 순서로 열을 정렬할 수 있습니다.
usort($myArray, function($a, $b) {
return [$a['column2'],$a['column1']] <=> [$b['column2'],$b['column1']];
});
한 열을 오름차순으로 정렬하고 다른 열을 내림차순으로 정렬해야 하는 경우 내림차순 열을 연산자의 다른 쪽과 바꿉니다.<=>
:
usort($myArray, function($a, $b) {
return [$a['column1'],$b['column2']] <=> [$b['column1'],$a['column2']];
});
키에 따라 정렬해야 하는 경우 다음을 사용하는 것이 가장 좋습니다.
usort($array, build_sorter('order'));
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
이 솔루션은 다차원 정렬을 위한 기억하기 쉬운 표기법을 사용하는 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 (a b 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
;
});
두 번째 작업:순위별 순서: 등급별, 성별, 이름별 순서
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
;
});
사용할 수 있습니다.usort
및 콜백 함수가 있는 사용자 정의 정렬 함수:
usort($new, fn($a, $b) => $a['order'] - $b['order']);
TRICK: 사용 가능a > b
또는a - b
또는a <=> b
오름차순으로 정렬합니다.내림차순의 경우 교환 위치만a
그리고.b
.
이것이 도움이 되었습니다.
$columns = array_column($data, "order");
array_multisort($columns, SORT_ASC, $data);
현실을 직시합시다.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);
}
}
언급URL : https://stackoverflow.com/questions/2699086/how-to-sort-a-multi-dimensional-array-by-value
'programing' 카테고리의 다른 글
암호의 정규식에는 최소 8자(숫자 하나 이상)와 소문자, 대문자 및 특수 문자를 모두 포함해야 합니다. (0) | 2022.12.10 |
---|---|
javax.websocket 클라이언트 단순 예시 (0) | 2022.12.10 |
ERROR 1054 (42S22):'필드 리스트'의 알 수 없는 열 ' ' (0) | 2022.12.10 |
mysqldump 명령줄 유틸리티를 사용하여 mysql 데이터베이스를 완전히 백업하는 방법 (0) | 2022.12.10 |
반복기 사용 시 현재 루프 인덱스를 가져오려면 어떻게 해야 합니까? (0) | 2022.12.10 |