숫자 인덱스 배열
대부분의 프로그래밍 언어에서 지원하는 방식이다.
1 2 3 4 5 6 7 8 9 10 11 12 | // 방식 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] 처럼 접근한다.
연관 배열
현대 프로그래밍 언어들은 연관 배열을 지원하는 경우도 흔히 볼 수 있다. 연관 배열은 인덱스를 문자열로 사용하여 그 값에 의미를 붙여 사용하는 방식이다.
1 2 3 4 5 6 7 8 9 10 11 | // 방식 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 문
1 2 3 4 5 6 7 8 9 | // 숫자 인덱스 배열 foreach ( $array as $item ) { echo $item . " " ; } // 연관 배열 foreach ( $array as $key => $value ) { echo "$key : $value" . '<br />' ; } |
foreach 문의 사용법은 위와 같다. 단, 연관 배열도 숫자 인덱스 배열 방식처럼 사용하면 값만 가져와 사용할 수도 있다.
each()와 list()
여기서 $prices는 위의 연관 배열 부분에서 정의한 배열이라고 생각하면 이해가 쉽다.
1 2 3 4 | while ( $element = each( $prices )) { echo $element [ 'key' ]. ' - ' ; echo $element [ 'value' ]. '<br />' ; } |
$prices의 키가 $element['key']에 저장되고 값은 $element['value']에 저장된다.
each() 함수는 현재 요소를 리턴하고 다음 요소를 현재 요소로 가리킨다.
1 2 3 4 5 | reset( $prices ); // 밑에서 설명 while (list( $product , $price ) = each( $prices )) { echo "$product - $price<br />" ; } |
list() 함수는 배열을 저장된 값만큼 분할한다. 키는 $product에, 값은 $price에 저장된다.
다차원 배열
언뜻 보면 복잡하지만 역시 타 언어와 다른 점이 크게 없으므로 간략하게 코드만 보고 넘어간다.
1 2 3 4 5 6 7 8 9 10 11 12 | // 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 />' ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // 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()
1 2 3 4 5 6 | $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()
1 2 3 4 5 6 7 | $prices = array ( 'Tires' =>100, 'Oil' =>10, 'Spark Plugs' =>4 ); asort( $prices ); // value ksort( $prices ); // key |
asort()는 값(value)을 기준으로 배열을 정렬하고 ksort()는 키(key)를 기준으로 배열을 정렬한다.
역순으로 정렬
역순 정렬은 아주 간단하다. sort앞에 r만 붙여주면 된다.
1 2 3 | rsort( $array ); arsort( $array ); krsort( $array ); |
다차원 배열 정렬하기
1차원 배열은 알파벳 순서라든가 크기 순으로 정렬할 수 있었지만 다차원 배열에서는 배열 자체를 비교해야 하기 때문에 좀 더 복잡해진다.
사용자 정의 정렬 usort()
1 2 3 4 | // 2차원 배열 $products = array ( array ( 'TIR' , 'Tires' , 100), array ( 'OIL' , 'Oil' , 10), array ( 'SPK' , 'Spark Plugs' , 4) ); |
위의 배열을 어떻게 정렬해야 할까? 여러 가지 방법이 있겠지만 물품의 설명을 알파벳 순서로 정렬한다거나 가격을 기준으로 정렬하는 방법 등을 생각해 볼 수 있다. 어떤 쪽이든 usort() 함수를 사용하기 위해서 우리가 직접 비교 함수를 만들어 주어야 한다. 여기서는 두 번째 데이터(설명)을 기준으로 알파벳 순으로 정렬해 보겠다.
1 2 3 4 5 6 7 8 9 10 11 | 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' ); |
1 2 3 4 5 6 7 8 9 10 11 | 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()
1 | shuffle( $pictures ); |
shuffle() 이름에서 알 수 있듯이 무작위로 섞어주는 함수이다.
array_reverse()
1 2 | $numbers = range(1, 10); $numbers = array_reverse ( $numbers ); |
기타 배열 관련 함수(미완성)
배열 탐색 함수
each(), current(), reset(), end(), next(), pos(), prev()
배열의 각 요소에 함수 적용하기
array_walk()
배열의 수 세기
count(), sizeof(), array_count_values()
배열을 스칼라 변수로 변환
extract()
array_push : 배열에 요소 추가
array_pop : 배열의 마지막 요소를 제거하고 그 값을 리턴
explode : 문자열을 seperator로 자르고 각 요소를 배열로 리턴, limit은 리턴하는 수를 제한할때 옵션으로 사용