배열을 요소로 가지는 배열 요소들을 요소의 특정 속성 순서로 정렬하고 싶습니다.
참고, object를 요소로 가지는 배열에도 적용됩니다.
아래 배열 요소를 날짜(a_date) 순서대로 정렬하고 싶습니다.
Array
(
[0] => Array
(
[a_idx] => 24316
[a_title] => (테스트) 하나둘 셋
[a_date] => 2020-08-13
)
[1] => Array
(
[a_idx] => 1382
[a_title] => 홍보자료 테스트
[a_date] => 2020-01-22
)
[2] => Array
(
[a_idx] => 1383
[a_title] => 교육자료 123
[a_date] => 2021-03-08
)
[3] => Array
(
[a_idx] => 24317
[a_title] => (테스트) 생명 존중
[a_date] => 2020-08-13
)
)
사용자가 정의할 수 있는 비교 함수를 이용하여 정렬할 수 있습니다.
usort(array &$array , callable $callback) : bool
날짜(a_date)가 일반 문자열이므로 문자열 비교 함수를 적용합니다.
usort($data, function ($a, $b) {
return strcmp($a['a_date'], $b['a_date']);
});
이렇게 하면 날짜(a_date) 오름차순으로 정렬합니다. 오래된 날짜가 먼저 옵니다.
날짜가 같으면 일련번호를 비교하도록 합니다.
usort($data, function ($a, $b) {
if (strcmp($a['a_date'], $b['a_date']) === 0) {
return strcmp($a['a_idx'], $b['a_idx']);
}
return strcmp($a['a_date'], $b['a_date']);
});
이렇게 하면 날짜(a_date) 오름차순, 일련번호(a_idx) 오름차순으로 정렬합니다. 오래된 요소가 먼저 옵니다.
PHP 문서에는
strcmp(string $str1, string $str2) : int
Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.
단순하게 생각하면,
str1 < str2 --> -1
str1 = str2 --> 0
str1 > str2 --> 1
이라고 생각할 수 있습니다. 오름차순으로 정렬합니다.
내림차순으로 정렬하려면, 결과 * -1 하여 비교 결과의 부호를 바꾸면 됩니다.
최근 날짜가 앞에 위치하도록 하려면
usort($data, function ($a, $b) {
if (strcmp($a['a_date'], $b['a_date']) === 0) {
return strcmp($a['a_idx'], $b['a_idx']) * -1;
}
return strcmp($a['a_date'], $b['a_date']) * -1;
});
최근 날짜가 먼저 오는 내림차순이며 날짜가 같으면 일련번호 내림차순으로 정렬합니다.
반응형