2015년 4월 10일 금요일

PHP 2차원 배열에서 열 기준으로 정렬 | Sorting 2-Dimensional Array by a Column in PHP

4×3 요소로 되어 있는 2차원 배열 $a를 다음과 같이 정의

<?php
$a = array(
    array("A", 3, "4"),
    array("C", 4, "2"),
    array("D", 10, "20"),
    array("B", 2, "10")
);

$a의 첫번째 열에는 "A", "C", "D", "B"라는 값이 순서대로 입력되어 있는데,
이 값들을 "A", "B", "C", "D" 순서대로 정렬하면서 두, 세번째 열의 값도 같이 정렬되게 하고 싶은 경우, 다음과 같은 함수를 정의하고 사용한다.

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($a, 0);

여기서 array_sort_by_column($a, 0)에 입력된 0이라는 값은
왼쪽으로부터 몇번째 칼럼인지를 의미하는데,
첫번째 칼럼을 0으로 인식한다.
정렬된 $a는 다음과 같은 배열로 표현될 수 있다.

array(
    array("A", 3, "4"),
    array("B", 2, "10"),
    array("C", 4, "2"),
    array("D", 10, "20")
);

Case 1

array_sort_by_column($a, 1);
array(
    array("B", 2, "10"),
    array("A", 3, "4"),
    array("C", 4, "2"),
    array("D", 10, "20")
);

Case 2

array_sort_by_column($a, 2);
array(
    array("C", 4, "2"),
    array("A", 3, "4"),
    array("B", 2, "10"),
    array("D", 10, "20")
);

위의 결과에서 알 수 있듯이
정렬되는 열에 숫자가 들어 있는 경우,
그 숫자가 int이든, string이든 숫자의 크기가 큰 순서대로 정렬이 된다.

이 함수에서는 정렬 방향을 기본적으로 오름차순으로 설정하였지만
인수를 하나 더 넣어서 내림차순으로 정렬할 수도 있다.

Case 3

$e = array_sort_by_column($a, 2, SORT_DESC);
array(
    array("D", 10, "20"),
    array("B", 2, "10"),
    array("A", 3, "4"),
    array("C", 4, "2")
);

댓글 1개: