복붙노트

PHP 배열 정렬하기

PHP

PHP 배열 정렬하기

값 기준 배열 정렬

가장 기본적인 정렬으로 값을 기준으로 배열을 정렬합니다.

값 기준 배열 정렬시에는 배열 순서가 바뀌면 배열의 키도 바뀝니다.
배열의 값을 기준으로 키를 자동 정렬합니다.

작은 순서대로 정렬

sort 함수를 사용합니다.

$fruits = array("lemon", "orange", "banana", "apple");  
sort($fruits);  

/*  
fruits[0] = apple  
fruits[1] = banana  
fruits[2] = lemon  
fruits[3] = orange  
*/  

큰 순서대로 정렬

rsort 함수 를 사용합니다.
이 함수는 array_reverse(sort(배열)) 과 동일합니다.

$fruits = array("lemon", "orange", "banana", "apple");  
rsort($fruits);  

/*  
0 = orange  
1 = lemon  
2 = banana  
3 = apple  
*/  

연관 배열 정렬

PHP에서는 차례대로 순서가 매겨지는 일반 배열과 키를 사용할 수 있는 연관 배열의 차이가 없습니다.
하지만 연관 배열의 경우 키가 중요하기 떄문에 키가 바뀌면 곤란하죠.
그래서 키를 유지한 채로 값의 순서만 바꾸는 정렬이 있습니다.

작은 순서대로 정렬

asort 함수 를 사용합니다.

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");  
asort($fruits);  

/*  
c = apple  
b = banana  
d = lemon  
a = orange  
*/  

큰 순서대로 정렬

arsort 함수 를 사용합니다.

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");  
arsort($fruits);  

/*  
a = orange  
d = lemon  
b = banana  
c = apple  
*/  

자연순 정렬

대소문자 구분

natsort 함수 를 사용합니다.

$array1 = array("img12.png", "img10.png", "img2.png", "img1.png");  
$array2 = $array1;  

natsort($array2);  
/*  
Array  
(  
[3] => img1.png  
[2] => img2.png  
[1] => img10.png  
[0] => img12.png  
)  
*/  

sort($array1);  
Array  
(  
[0] => img1.png  
[1] => img10.png  
[2] => img12.png  
[3] => img2.png  
)  

보통 사람은 1,2,3,... 10, 11 의 순서로 문자를 읽지만, 컴퓨터는 1,10,11,2,3 의 순서로 문자를 읽습니다.
이런것을 바로 잡기 위한 함수입니다.

대소문자 구분 안하기

natcasesort 함수를 사용합니다.

$array1 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');  

natcasesort($array2);  

/*  
Array  
(  
[0] => IMG0.png  
[4] => img1.png  
[3] => img2.png  
[5] => IMG3.png  
[2] => img10.png  
[1] => img12.png  
)  
*/  

natsort와 차이점은 대소문자를 구분하지 않는다는 점입니다.

키 기준 정렬

값이 아니라 키를 기준으로 정렬하고 싶을 때도 있습니다.
아마도 연관배열에서만 사용하겠죠.

작은 순서대로 정렬

ksort 함수 를 사용합니다.

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");  
ksort($fruits);  

/*  
a = orange  
b = banana  
c = apple  
d = lemon  
*/  

큰 순서대로 정렬

krsort 함수 를 사용합니다.

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");  
ksrort($fruits);  

/*  
d = lemon  
c = apple  
b = banana  
a = orange*/  

사용자 정의 함수를 써서 배열 정렬하기

1차원 배열의 경우에는 위의 함수로 거의 사용 가능할 것입니다.
그런데 2차원 배열이나 객체 배열을 정렬하려면 어떻게 해야 할까요?
그럴때를 대비해서 3가지 함수가 존재합니다.

값 기준 정렬

usort 함수를 사용합니다.
다만 usort는 ursort 같이 일단 정렬한 후 그 순서를 뒤집는 함수는 없습니다.
만약 정렬 후 순서를 뒤집고 싶다면 array_sort(usort(배열이름, 인수))
형식을 사용하세요.

다차원 배열 정렬 예시

function cmp($a, $b)  
{  
return strcmp($a["fruit"], $b["fruit"]);  
}  

$fruits = array(  
array('fruit'=>'lemons'),  
array('fruit'=>'apples'),  
array('fruit'=>'grapes'),  
);  

usort($fruits, "cmp");  

/*  
$fruits[0]: apples  
$fruits[1]: grapes  
$fruits[2]: lemons  
*/  

usort 함수의 첫번째 인수는 배열이고, 두번째 함수는 함수의 "문자열" 임을 유의하세요.

참고로 strcmp 함수는 문자열을 비교해 주는 함수입니다.
문자열 2개를 인수로 받아서

  • 첫번째 인수가 두번째 인수보다 크다면 1을 반환합니다.
  • 첫번째 인수와 두번째 인수가 같다면 0을 반환합니다.
  • 첫번째 인수와 두번째 인수보다 작다면 -1을 반환합니다.

객체의 멤버 배열 정렬 예시

class ClsTest {  
var $name;  

function ClsTest($name)  
{  
$this->name = $name;  
}  

static function compare($a, $b)  
{  
$aname = $a->name;  
$bname = $b->name;  
if ($aname > $bname){  
return 1;  
}  
if ($aname == $bname){  
return 0;  
}  
if ($aname < $bname){  
return -1;  
}  
}  
}  

$a = array(  
new ClsTest("c"),  
new ClsTest("b"),  
new ClsTest("d")  
);  

usort($a, array("clsTest", "compare"));  

/*  
b  
c  
d  
*/  

usort 함수의 첫번째 인수는 배열이고, 두번째 함수는 배열이 들어갑니다.
배열의 첫번째 인수는 클래스의 "문자열" 이름, 두번째 인수는 비교할 함수의 "문자열"입니다.
또한 비교할 함수는 static 으로 정적 함수여야 한다는 점 유의해 주세요.

키 기준 정렬

uksort 함수 를 사용합니다.

키가 다차원 배열이나 객체인 경우는 거의 없기 때문에 그다지 쓰일 일은 없습니다만, 만약 키가 일관성이 없어서 정규화를 해야 한다던가 하는 경우에 쓸 수 있습니다.

function cmp($a, $b)  
{  
$a = preg_replace('@^(a|an|the) @', '', $a);  
$b = preg_replace('@^(a|an|the) @', '', $b);  
return strcasecmp($a, $b);  
}  

$a = array("John" => 1, "the Earth" => 2, "an apple" => 3, "a banana" => 4);  

uksort($a, "cmp");  

foreach ($a as $key => $value) {  
echo "$key: $value\n";  
}  

/*  
an apple: 3  
a banana: 4  
the Earth: 2  
John: 1  
*/  

위 예제는 키에 관사(a, an, the) 가 붙어있을 경우 관사를 제거하고 정렬하는 예시입니다.

연관 배열 정렬

uasort 함수를 사용합니다.

다차원 연관 배열 정렬

$arr = array ( 10 => array('id' => 'dix',  'aa' => '1010'),  
100 => array('id' => 'cent', 'aa' => '100100'),  
2 => array('id' => 'deux', 'aa' => '22'),  
7 => array('id' => 'sept', 'aa' => '77'));  

function ud_sort ($a, $b) { return (strcmp ($a['id'],$b['id']));}  
var_dump(uasort($arr, 'so'));  
/*  

[100] => Array  
(  
[id] => cent  
[aa] => 100100  
)  

[2] => Array  
(  
[id] => deux  
[aa] => 22  
)  

[10] => Array  
(  
[id] => dix  
[aa] => 1010  
)  

[7] => Array  
(  
[id] => sept  
[aa] => 77  
))  
*/  


'PHP' 카테고리의 다른 글

PHP 날짜 차이 계산하기  (0) 2017.11.15
PHP JSON 다루기  (0) 2017.11.14
PHP 에서 오류 메세지 보기  (0) 2017.11.13
PHP 타임존 설정  (0) 2017.11.13
PHP에서 날짜 및 시간 다루기  (0) 2017.11.12