숫자 인덱스 배열
대부분의 프로그래밍 언어에서 지원하는 방식이다.
// 방식 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 $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에 저장된다.
다차원 배열
언뜻 보면 복잡하지만 역시 타 언어와 다른 점이 크게 없으므로 간략하게 코드만 보고 넘어간다.
// 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);
기타 배열 관련 함수(미완성)
배열 탐색 함수
each(), current(), reset(), end(), next(), pos(), prev()
배열의 각 요소에 함수 적용하기
array_walk()
배열의 수 세기
count(), sizeof(), array_count_values()
배열을 스칼라 변수로 변환
extract()
array_push : 배열에 요소 추가
array_pop : 배열의 마지막 요소를 제거하고 그 값을 리턴
explode : 문자열을 seperator로 자르고 각 요소를 배열로 리턴, limit은 리턴하는 수를 제한할때 옵션으로 사용