PHP 배열 정렬하기
PHPPHP 배열 정렬하기
값 기준 배열 정렬
가장 기본적인 정렬으로 값을 기준으로 배열을 정렬합니다.
값 기준 배열 정렬시에는 배열 순서가 바뀌면 배열의 키도 바뀝니다.
배열의 값을 기준으로 키를 자동 정렬합니다.
작은 순서대로 정렬
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 |