본문 바로가기

개발

요소의 특정 속성에 따라 배열 요소를 정렬하기

배열을 요소로 가지는 배열 요소들을 요소의 특정 속성 순서로 정렬하고 싶습니다.
참고, 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;
});

최근 날짜가 먼저 오는 내림차순이며 날짜가 같으면 일련번호 내림차순으로 정렬합니다.

 

반응형