PHP

[PHP] 3장 배열 사용하기

숫자 인덱스 배열

대부분의 프로그래밍 언어에서 지원하는 방식이다.

// 방식 1
$products = array('Tires', 'Oil', 'Spark Plugs');

// 방식 2
$numbers = range(1, 10); // 1~10
$odds = range(1, 10, 2); // 1,3,5,7,9
$letters = range('a', 'z'); // a~z

// 방식 3
$products[0] = 'Tires'; // $products가 미리 정의되어 있지 않아도 된다.
$products[1] = 'Oil';
$products[2] = 'Spark Plugs';

php는 배열의 크기가 동적으로 늘어나는 방식이라서 방식 3과 같은 형태로도 배열을 생성할 수 있다.

배열에 접근하는 방식은 타 언어와 마찬가지로 $products[0], $products[1], $products[2] 처럼 접근한다.

range()함수는 일정한 범위를 반환하는 함수이다. 첫 번째 인자에 시작 값, 두 번째 인자에 마지막 값을 입력하면 범위의 모든 값으로 배열을 반환한다. 세 번째 인자는 옵션인데 증가량을 표현할 수 있다. 만약 -1을 입력하면 감소하는 배열을 만들 수 있다.

 

연관 배열

현대 프로그래밍 언어들은 연관 배열을 지원하는 경우도 흔히 볼 수 있다. 연관 배열은 인덱스를 문자열로 사용하여 그 값에 의미를 붙여 사용하는 방식이다.

// 방식 1
$prices = array(
    'Tires'=>100,
    'Oil'=>10,
    'Spark Plugs'=>4
);

// 방식 2
$prices['Tires'] = 100;
$prices['Oil'] = 10;
$prices['Spark Plugs'] = 4;

배열에 접근하는 방법은 방식 2의 좌변처럼 접근하면 된다. 연관 배열은 숫자 인덱스가 없기 때문에 루프로 접근할 때 일반적인 방법으로는 for문으로 접근할 수 없다. 대신에 foreach문과 같은 방법을 사용한다.

 

루프로 접근하기

foreach 문

// 숫자 인덱스 배열
foreach($array as $item) {
    echo $item." ";
}

// 연관 배열
foreach($array as $key => $value) {
    echo "$key : $value".'<br />';
}

foreach 문의 사용법은 위와 같다. 단, 연관 배열도 숫자 인덱스 배열 방식처럼 사용하면 값만 가져와 사용할 수도 있다.

 

each()와 list()

여기서 $prices는 위의 연관 배열 부분에서 정의한 배열이라고 생각하면 이해가 쉽다.

while($element = each($prices)) {
    echo $element['key'].' - ';
    echo $element['value']. '<br />';
}

$prices의 키가 $element['key']에 저장되고 값은 $element['value']에 저장된다.

each() 함수는 현재 요소를 리턴하고 다음 요소를 현재 요소로 가리킨다.

reset($prices); // 밑에서 설명

while(list($product, $price) = each($prices)) {
    echo "$product - $price<br />";
}

list() 함수는 배열을 저장된 값만큼 분할한다. 키는 $product에, 값은 $price에 저장된다.

한 스크립트 내에서 배열을 두 번 이상 탐색해야 한다면, reset() 함수를 사용해야 한다. reset() 함수는 배열의 처음을 가리키도록 하는 함수이며 each()를 사용하면 배열을 가리키는 위치가 계속 바뀌게 되므로 나중에 처음부터 다시 탐색할 일이 생긴다면 reset()함수를 사용해야 한다.
(참고) 배열 연산자는 1장 PHP 훑어보기(1) 의 연산자 부분에 설명되어 있다. 

 

다차원 배열

언뜻 보면 복잡하지만 역시 타 언어와 다른 점이 크게 없으므로 간략하게 코드만 보고 넘어간다.

// 2차원 배열
$products = array( array('TIR', 'Tires', 100),
                   array('OIL', 'Oil', 10),
                   array('SPK', 'Spark Plugs', 4) );

// 출력
for($row=0; $row<3; $row++) {
    for($col=0, $col<3; $col++) {
        echo '|'.$products[$row][$col];
    }
    echo '|<br />';
}
// 2차원 연관 배열
$products = array( array('Code'         => 'TIR',
                         'Description'  => 'Tires',
                         'Price'        => 100
                        ),
                   array('Code'         => 'OIL',
                         'Description'  => 'Oil',
                         'Price'        => 10
                        ),
                   array('Code'         => 'SPK',
                         'Description'  => 'Spark Plugs',
                         'Price'        => 4
                        )
);

// 출력 1
for($row=0, $row<3; $row++) {
    echo '|'.$products[$row]['Code'];
    echo '|'.$products[$row]['Description'];
    echo '|'.$products[$row]['Price'].'|<br />';
}

// 출력 2
for($row=0; $row<3; $row++) {
    while(list($key, $value) = each($products[$row])) {
        echo "|$value";
    }
    echo '|<br />';
}

3차원 이상의 배열도 같은 방식으로 array를 겹쳐주면 된다.(생략)

 

배열 정렬하기

sort() 

$products = array('Tires', 'Oil', 'Spark Plugs');
sort($products); // Oil, Spark Plugs, Tires

$prices = array(100, 10, 4);
sort($prices); // 4, 10, 100
sort($prices, SORT_STRING); // 10, 100, 4

sort()는 알파벳이나 크기순으로 배열을 정렬한다.

sort()의 두 번째 인자 값(문자열이나 숫자를 포함하고 있을 때 사용)

  • SORT_REGULAR : 기본값
  • SORT_NUMERIC : 숫자 크기 기준 정렬
  • SORT_STRING : 문자 기준 정렬

 

asort(), ksort()

$prices = array(
    'Tires'=>100,
    'Oil'=>10,
    'Spark Plugs'=>4
);
asort($prices); // value
ksort($prices); // key

asort()값(value)을 기준으로 배열을 정렬하고 ksort()키(key)를 기준으로 배열을 정렬한다.

 

역순으로 정렬

역순 정렬은 아주 간단하다. sort앞에 r만 붙여주면 된다.

rsort($array);
arsort($array);
krsort($array);

 

다차원 배열 정렬하기

1차원 배열은 알파벳 순서라든가 크기 순으로 정렬할 수 있었지만 다차원 배열에서는 배열 자체를 비교해야 하기 때문에 좀 더 복잡해진다.

사용자 정의 정렬 usort()

// 2차원 배열
$products = array( array('TIR', 'Tires', 100),
                   array('OIL', 'Oil', 10),
                   array('SPK', 'Spark Plugs', 4) );

위의 배열을 어떻게 정렬해야 할까? 여러 가지 방법이 있겠지만 물품의 설명을 알파벳 순서로 정렬한다거나 가격을 기준으로 정렬하는 방법 등을 생각해 볼 수 있다. 어떤 쪽이든 usort() 함수를 사용하기 위해서 우리가 직접 비교 함수를 만들어 주어야 한다. 여기서는 두 번째 데이터(설명)을 기준으로 알파벳 순으로 정렬해 보겠다.

function compare($x, $y) {
    if($x[1] == $y[1])
        return 0;
    else if($x[1] < $y[1])
        return -1;
    else
        return 1;
}
// 같으면 0, 작으면 -1, 크면 1을 리턴

usort($products, 'compare');
function reverse_compare($x, $y) {
    if($x[1] == $y[1])
        return 0;
    else if($x[1] < $y[1])
        return 1;
    else
        return -1;
}
// 같으면 0, 작으면 1, 크면 -1을 리턴(역순)

usort($products, 'reverse_compare');

 

배열 재배치

shuffle()

shuffle($pictures);

shuffle() 이름에서 알 수 있듯이 무작위로 섞어주는 함수이다.

 

array_reverse()

$numbers = range(1, 10);
$numbers = array_reverse($numbers);
array_reverse() 함수는 인자로 받은 배열을 정렬시키는 것이 아닌, 정렬된 새로운 배열을 반환하는 함수이다. 만약 굳이 새로운 배열을 만들 필요가 없는 경우라면 예제처럼 원래의 배열에 다시 대입해 사용하면 된다.

 

기타 배열 관련 함수(미완성)

배열 탐색 함수

each(), current(), reset(), end(), next(), pos(), prev()

배열의 각 요소에 함수 적용하기

array_walk()

배열의 수 세기

count(), sizeof(), array_count_values()

배열을 스칼라 변수로 변환

extract()

(참고) array_push($array, $value), array_pop($array), explode($seperator, $string, $limit)
array_push : 배열에 요소 추가
array_pop : 배열의 마지막 요소를 제거하고 그 값을 리턴
explode : 문자열을 seperator로 자르고 각 요소를 배열로 리턴, limit은 리턴하는 수를 제한할때 옵션으로 사용

댓글

댓글 본문
  1. 호기심땅콩
    정리를 잘해주셔서 잘 봤습니다. 활용하는데 큰 도움이 되었습니다.
  2. 오네로이스
    정말 필요한 내용이였는데 잘 정리되어있네요
    정말 감사들비니다.
  3. 푸른샛별
    5.6 기준 foreach에서 원 데이터 키가 정수와 문자열이 혼재되어 있을 때 연관 배열키는 전부 무시되는 버그가 있습니다.
  4. 플러그
    플래시와 php를 같이 사용하는데, 웹쪽으로는 호스팅 받아서 접속하는 방법도 몰라서 쩔쩔매었습니다.
    php에도 배열이 있군요. 정말 자세하고 친절한 설명 감사드립니다.
버전 관리
miki
현재 버전
선택 버전
graphittie 자세히 보기