2015. 2. 2. 14:33

프로그래밍을 하다보면 배열을 사용할 때가 많습니다.

그런데 종종 배열을 정렬해서 사용해야 할 때가 있습니다.

오늘은 배열을 정렬하는 것에 대해 포스팅하겠습니다.

 

PHP에서 배열과 관련된 함수들은 http://php.net/manual/en/ref.array.php에서 확인하실 수 있습니다.

그중에서 정렬과 관련된 함수 몇개를  뽑아보자면 다음과 같습니다.

1. sort()

2. rsort()

3. ksort()

4. krsort()

5. usort()

6. uksort()

7. uasort()

등등...(물론 배열의 정렬과 관련된 함수는 더 있습니다.)

 

위 함수이름에서 sort()라는 이름 앞에 위치한 문자의 공통적인 부분을 알려드리겠습니다.

1. r : 정렬방식이 reverse order (내림차순, descend)라는 뜻입니다.

2. k : 정렬기준이 배열의 값이 아닌 키값을 가지고 정렬한다는 의미입니다.

3. u : 사용자가 정의한 비교함수를 가지고 정렬한다는 의미입니다.

 

즉, 위의 공통적인 부분을 가지고 함수 이름을 보면

1. sort() : 인수로 주어진 배열의 값을 오름차순으로 정렬하여 반환합니다.

2. rsort() : 인수로 주어진 배열의 값을 내림차순으로 정렬하여 반환합니다.

3. ksort() : 인수로 주어진 배열의 키값을 오름차순으로 정렬하여 반환합니다.

4. krsort() : 인수로 주어진 배열의 키값을 내림차순으로 정렬하여 반환합니다.

5. usort() : 사용자가 정의한 비교함수를 사용하여 배열의 값을 오름차순으로 정렬하여 반환합니다.

6. uksort() : 사용자가 정의한 비교함수를 사용하여 배열의 키값을 오름차순으로 정렬하여 반환합니다.

7. uasort() : 사용자가 정의한 비교함수를 사용하며 정렬하지만 배열의 인덱스 값을 유지합니다.

 

각 함수의 이름에 함수 설명페이지로 링크하였습니다.

이미 함수 설명에 예제가 잘 되어 있기 때문에

하나하나 예를 보여드리자니 너무 많아서...(사실 제가 좀 게을러서...ㅡㅡ;)

 

 

위 함수중 1~4까지의 함수는

첫번째 인수로 배열을 받으며 두번째 인수로 졍렬과 관련된 플래그를 받습니다.(두번째 인수는 생략가능합니다.)

 

5~7번까지의 함수는 마찬가지로

첫번째 인수로 배열을 받지만 두번째 인수로는 사용자가 정의한 함수를 받습니다.

따라서 5~7번까지의 함수를 사용하면 2차원 이상의 배열도 정렬이 가능합니다.

 

2차원 배열을 가지고 정렬하는 예를 들어보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arrTmp[0] = array('a' => 'abc', 'b' => 'bcd');
$arrTmp[1] = array('a' => 'cde', 'b' => 'aaa');
$arrTmp[2] = array('a' => 'efg', 'b' => 'fgh');

function user_compare_data($a, $b){
 if ($a == $b) {
  return 0;
 }
 return ($a < $b) ? -1 : 1;
}

usort($arrTmp, 'user_compare_data');

foreach ($arrTmp as $item) {
 echo $item['a'] . ', ' . $item['b'] . "
"; }

 

위 코드의 결과는 다음과 같이 나옵니다.

 

abc, bcd
cde, aaa
efg, fgh

 

즉, 주어진 배열의 2차원 배열의 첫번째 키의 값을 기준으로 오름차순 정렬한 결과가 반환됩니다.

 

다음 코드를 보시겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arrTmp[0] = array('a' => 'abc', 'b' => 'bcd');
$arrTmp[1] = array('a' => 'cde', 'b' => 'aaa');
$arrTmp[2] = array('a' => 'efg', 'b' => 'fgh');

function user_compare_data($a, $b){
 if ($a['b'] == $b['b']) {
  return 0;
 }
 return ($a['b'] < $b['b']) ? -1 : 1;
}

usort($arrTmp, 'user_compare_data');

foreach ($arrTmp as $item) {
 echo $item['a'] . ', ' . $item['b'] . "
"; }

 

이 코드의 결과는 다음과 같이 나옵니다.

 

cde, aaa
abc, bcd
efg, fgh

 

사용자 정의 함수에서 2차 배열의 b라는 키값을 기준으로 정렬하게끔 하였기 때문에

정렬 결과가 달라졌습니다.

 

위와 같이 하여 2차원 이상의 배열도 처리가 가능합니다.

 

Posted by 작은0악마