개발 Q&A

제목 연관 배열의 특정 키의 값을 이용하여 정렬
카테고리 PHP
글쓴이 주말생각 작성시각 2021/01/08 18:04:01
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 6046   RSS

연관 배열의 특정 키의 값을 이용하여 정렬을 하려고 합니다.

아래 예제처럼

$testArr = [

["KEY1"=>"서울", "order1"=>"5", "KEY2"=>"이순신", "KEY3"=>"조선", "order2"=>"2"],

["KEY1"=>"도쿄", "order1"=>"3", "KEY2"=>"사무라이", "KEY3"=>"일본", "order2"=>"7"],

["KEY1"=>"베이징", "order1"=>"9", "KEY2"=>"곽거병", "KEY3"=>"한나라", "order2"=>"3"],

["KEY1"=>"워싱턴", "order1"=>"1", "KEY2"=>"링컨", "KEY3"=>"미국", "order2"=>"4"],

["KEY1"=>"상하이", "order1"=>"9", "KEY2"=>"유비", "KEY3"=>"한나라", "order2"=>"2"],

["KEY1"=>"뉴욕", "order1"=>"1", "KEY2"=>"스파이더맨", "KEY3"=>"미국", "order2"=>"5"]

];

function sortByOrder($a, $b) {

    return $a['order1'] - $b['order1'];

}

usort($testArr, 'sortByOrder');

당연히 배열이 order1으로 정렬되어 key1이 워싱턴, 뉴욕, 도쿄, 서울, 베이징, 상하이으로 출력됩니다. 그런데 원하고자 하는 바는 order1을 1순위로 정렬하고 2순위 정렬로 order2를 추가하여

key1이 뉴욕, 워싱턴, 도쿄, 서울, 상하이, 베이징 순으로 정렬하려고 하는데 구글링 실력이 부족해서인지 방법을 못 찾겠습니다.

 

 다음글 MySQL 특정 컬럼의 개별 값들의 갯수 구하기 (2)
 이전글 몽고 디비 삭제 관련입니다. (2)

댓글

한대승(불의회상) / 2021/01/11 10:23:39 / 추천 0

ci4 array 헬퍼의 array_sort_by_multiple_keys() 함수를 사용하시면 될것 같습니다.

 

주말생각 / 2021/01/11 10:43:34 / 추천 0

@한대승(불의회상

작업 환경이 CI3인데 3버전에는 없는 것 같은데, 다른 방법이 있을까요?

한대승(불의회상) / 2021/01/11 10:48:18 / 추천 0
array_sort_by_multiple_keys() 함수만 떼어다 사용하시면 될듯
주말생각 / 2021/01/11 11:09:56 / 추천 0
제가 초보라서 그런데 "array_sort_by_multiple_keys() 함수만 떼어다 사용"한다는 말씀이 어떻게 하는 건지 잘 이해가 안됩니다.
한대승(불의회상) / 2021/01/11 11:52:55 / 추천 0
function array_sort_by_multiple_keys(array &$array, array $sortColumns): bool
{
    // Check if there really are columns to sort after
    if (empty($sortColumns) || empty($array))
    {
        return false;
    }

    // Group sorting indexes and data
    $tempArray = [];
    foreach ($sortColumns as $key => $sortFlag)
    {
        // Get sorting values
        $carry = $array;

        // The '.' operator separates nested elements
        foreach (explode('.', $key) as $keySegment)
        {
            // Loop elements if they are objects
            if (is_object(reset($carry)))
            {
                // Extract the object attribute
                foreach ($carry as $index => $object)
                {
                    $carry[$index] = $object->$keySegment;
                }

                continue;
            }

            // Extract the target column if elements are arrays
            $carry = array_column($carry, $keySegment);
        }

        // Store the collected sorting parameters
        $tempArray[] = $carry;
        $tempArray[] = $sortFlag;
    }

    // Append the array as reference
    $tempArray[] = &$array;

    // Pass sorting arrays and flags as an argument list.
    return array_multisort(...$tempArray);
}

PHP 7.x 버전이니 버전에 맞추어서 수정해 쓰시면됩니다.

주말생각 / 2021/01/11 13:00:48 / 추천 0
답변 감사합니다.