[PHP] 기본 문법 정리 (3) (feat. 배열)
by 뚜부니배열
배열은 한 쌍의 키(key)와 값(value)으로 이루어진 맵(map)으로 구성된 순서가 있는 집합입니다.
배열은 주로 연관된 데이터를 모아서 관리하기 위해 사용하는 데이터 타입입니다.
PHP에서의 배열은 다은 언어에서 리스트라고도 하는 형태입니다! 😎😎
1. 1차원 배열
1.1. 배열 생성 및 요소 추가
배열을 생성할 때는 array()라는 함수를 이용하며, 배열 이름은 배열을 선언한 후 해당 배열에 접근하기 위해 사용합니다.
$배열이름 = array();
배열의 요소에 접근하기 위해서는 인덱스(index)를 사용하는데, 0부터 시작하는 숫자 인덱스를 지원합니다.
$배열이름[인덱스]
이 인덱스를 이용하면 배열에 요소를 추가할 수 있습니다.
<?php
$arr = array();
$arr[0] = "A";
$arr[1] = "B";
$arr[2] = "C";
var_dump($arr);
?>
위의 코드를 실행하면 다음과 같이 배열이 생성되고, 해당 배열에 요소가 추가되었음을 확인할 수 있습니다.
이렇게 나눠서 생성하고 추가해도 되지만, 생성과 동시에 배열 요소를 초기화할 수도 있습니다.
$배열이름 = array(배열요소1, 배열요소2, ...);
위의 코드와 같은 결과가 나오는지 아래 코드를 실행시켜서 확인해보겠습니다!
<?php
$arr = array();
$arr[0] = "A";
$arr[1] = "B";
$arr[2] = "C";
var_dump($arr);
?>
아래 결과를 보면 실행 결과가 동일함을 알 수 있습니다.
생성과 동시에 초기화를 해야한다면 이렇게 쓰는게 코드 길이가 더 줄어들겠네요 😄😄
1.2. 배열의 홀 (hole)
PHP에서는 배열의 특정 인덱스에만 배열 요소를 추가할 수 있습니다.
배열을 하나 생성해서 10번 인덱스에만 배열의 요소를 추가하고 나머지는 빈 배열로 유지해두면 어떻게 될까요?
<?php
$arr = array();
$arr[10] = "hello";
var_dump($arr);
var_dump($arr[0]);
var_dump(isset($arr[0]));
var_dump(isset($arr[10]));
?>
실행시킨 결과, 아래와 같이 전체 배열 중 10번 인덱스에만 요소인 'hello'가 들어있음을 확인할 수 있으며,
0번 인덱스에는 기본값인 null이 들어있음을 확인 할 수 있습니다.
isset() 함수는 인수로 전달받은 변수가 초기화되어 있는지 확인해주는데,
0번 인덱스는 초기화하지 않았기 때문에 false, 10번 인덱스는 'hello'로 초기화했기 때문에 true를 반환합니다.
이렇듯 PHP에서는 빈 배열의 일부 값만 채울 수 있으며, 배열 요소가 없는 부분을 배열의 홀(hole)이라고 합니다.
PHP에서는 이러한 배열의 홀을 참조하게 되면, 초기화되지 않은 변수를 참조할 때처럼 기본값인 null을 반환합니다.
1.3. 배열과 반복문
배열에 있는 정보를 하나씩 꺼내서 처리하고 싶다면 반복문을 사용하면 됩니다.
<?php
$arr = array("A", "B", "C");
for ($i=0; $i<count($arr); $i++) {
echo $arr[$i]."<br/>";
}
?>
위의 코드에서 count()는 배열의 모든 요소의 개수를 반환하는 함수입니다.
배열에 3개의 요소가 존재하므로 count($arr)은 3이겠네요! 😄😄
그렇다면 만약 배열의 일부 요소만 채워져있다면 어떻게 될까요? 🤔🤔
<?php
$arr = array();
$arr[2] = "A";
$arr[3] = "B";
$arr[4] = "C";
for ($i=0; $i<count($arr); $i++) {
echo $arr[$i]."<br/>";
}
?>
코드를 실행시킨 결과, A만 출력되는 것을 확인할 수 있습니다.
아쉽게도 count()는 전체 길이가 아닌 배열의 요소에 대한 수를 반환하기 때문에
3번의 반복문 수행으로 0, 1, 2번 인덱스에 대해서만 접근을 했습니다. 😅😅
그렇다면 요소에만 접근하여 출력하는 방법은 없을까요?!
있습니다!! foreach를 사용하면 배열의 모든 요소에 접근할 수 있어요!
<?php
$arr = array();
$arr[2] = "A";
$arr[3] = "B";
$arr[4] = "C";
foreach ($arr as $element) {
echo $element."<br/>";
}
?>
다음 코드를 수행시키며 아래와 같이 A, B, C가 출력된 것을 확인할 수 있습니다.
배열에 빈 요소가 있다면, foreach를 사용하는 것이 더 좋을 것 같네요..! 😊😊
1.4. 배열의 조작
이전에도 언급했듯 PHP 배열은 다른 언어에서 리스트 형태의 데이터 타입이기 때문에
배열에 요소를 추가하거나 삭제하는 것이 가능합니다. 또한, 정렬과 역순 정렬도 가능합니다.
어떻게 쓰는지 코드로 확인해보겠습니다!
<?php
// 배열 초기화
$arr = array("A", "B", "C");
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 맨 끝에 요소 추가
array_push($arr, "D");
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 맨 끝에 복수 요소 추가 (배열 결합 느낌)
$arr = array_merge($arr, ["E", "F"]);
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 맨 앞에 요소 추가
array_unshift($arr, "G");
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 특정 위치에 요소 추가.
// 여기서는 2번 인덱스에 요소를 추가하며, 기존의 요소들을 한 칸씩 밀어냄
array_splice($arr, 2, 0, "H");
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 만약 기존의 2번 요소부터 길이 4까지를 제거하고 난 후,
// 2번 인덱스에 추가하고 싶다면 다음과 같이 쓰면 됨
array_splice($arr, 2, 4, "I");
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 맨 앞 요소 제거
array_shift($arr);
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 배열의 맨 뒤 요소 제거
array_pop($arr);
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 정렬
sort($arr);
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
// 역순 정렬
rsort($arr);
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i];
echo "<br />";
?>
코드를 수행시킨 결과는 다음과 같습니다. 어떤 느낌인지 아시겠죠?!
혹시 몰라 쓰는 방식에 대해 한 번 더 정리해보았습니다!
배열의 맨 끝에 요소 추가
array_push($배열이름, 배열요소);
배열의 맨 끝에 복수 요소 추가
$배열이름 = array_merge($배열이름, [배열요소1, 배열요소2]);
배열의 맨 앞에 요소 추가
array_unshift($배열이름, 배열요소);
배열의 특정 인덱스에 요소 추가
array_splice($배열이름, 인덱스번호, 0, 배열요소);
배열의 특정 인덱스 기준으로 특정 길이 제거 후 요소 추가
array_splice($배열이름, 인덱스번호, 제거할길이, 배열요소);
배열의 맨 앞 요소 제거
array_shift($배열이름);
배열의 맨 뒤 요소 제거
array_pop($배열이름);
정렬
sort($배열이름);
역순정렬
rsort($배열이름);
2. 다차원 배열
다차원 배열은 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 사용하는 형태입니다.
2.1. 2차원 배열
2차원 배열이란 배열 요소로 또 다른 1차원 배열을 사용하는 배열을 의미합니다.2차원 배열은 다음과 같은 문법에 따라 선언됩니다.
$배열이름 = array(
array(),
array(),
....
);
2.2. 2차원 배열 요소 입력
2차원 배열도 1차원 배열과 동일하게 요소에 접근하기 위해서는 인덱스를 사용해야 합니다.
2차원 배열에 속한 요소에 접근할 때에는 [] 연산자를 두 번 사용하면 됩니다.
<?php
// 1차원 배열을 3개 갖는 2차원 배열 선언
$arr = array(
array(),
array(),
array()
);
// 배열의 요소 추가
$arr[0][0] = "A";
$arr[0][1] = "B";
$arr[0][2] = 100;
$arr[1][0] = "C";
$arr[1][1] = 200;
$arr[1][2] = "E";
$arr[2][0] = false;
$arr[2][1] = 0.03;
$arr[2][2] = true;
var_dump($arr);
echo $arr[0][0]." ".$arr[0][1]." ".$arr[0][2]."<br/>";
echo $arr[1][0]." ".$arr[1][1]." ".$arr[1][2]."<br/>";
echo $arr[2][0]." ".$arr[2][1]." ".$arr[2][2]."<br/>";
?>
PHP는 신기하게도 서로 다른 형이 저장되는 형태더라구요?! 🤫🤫
보통 다른 언어에서는 배열에 같은 형만 저장되어서 조금 놀랬어요. 이런 신기한 언어가 있다니..!! 😮😮
인덱스에 접근해서 출력해보니 false는 아무런 값도 출력되지 않고, true는 1이 출력되더라구요
알 수 없는 PHP의 배열 방식.......... 조금 충격적이었어요..... 👀.......
1차원 배열과 마찬가지로 2차원 배열도 선언하면서 동시에 배열 요소를 초기화할 수 있습니다.
$배열이름 = array(
array(배열요소00, 배열요소01, ...),
array(배열요소10, 배열요소11, ...),
...
);
2.3. 2차원 배열과 반복문
for문에 배열의 인덱스를 이용하여 배열 요소에 접근하는 것도 가능합니다!
다만, 1차원 배열과 달리 행과 열에 대해 for문을 2번 사용해야합니다.
<?php
// 1차원 배열을 3개 갖는 2차원 배열 선언
$arr = array(
array(1, 2, 3),
array(4, 5, 6),
array(7, 8, 9)
);
for($row = 0; $row < count($arr); $row++){
for($column = 0; $column < count($arr[$row]); $column++){
echo $arr[$row][$column]." ";
}
}
?>
Comment
코드 실행 결과를 보면 제대로 접근되는 것을 확인할 수 있습니다.
2차원 배열뿐만 아니라 다차원 배열에 대해서도 어떻게 해야할지 알겠죠?! 😊😊
3. 연관 배열
PHP에서는 숫자뿐만 아니라 문자열도 배열 요소의 인덱스로 사용할 수 있습니다.
다른 언어에서 Hash Map, Dictionary와 비슷한 느낌이죠.... 이런 것도 되네요..?! 👀......
만약 정수와 문자열 이외에 다른 타입의 값을 키 값으로 사용하면,
내부적으로 정수와 문자열로 타입 변환이 이루어집니다.
연관 배열을 생성하는 방법은 정수를 인덱스로 하는 배열을 생성하는 방법과 동일합니다.
$배열이름 = array();
3.1. 연관 배열의 참조
연관 배열의 각 요소를 참조하고 싶을 때는 배열 이름과 함께 키(key)를 사용하면 됩니다.
$배열이름["키"] = 값;
선언과 동시에 배열 요소를 추가하고 싶다면 다음 방식을 사용하면 됩니다.
$배열이름 = array("키1" => 값1, "키2" => 값2, ...);
이미 생성된 연관 배열에 새로운 요소를 추가하는 것도 가능하며,
존재하지 않은 배열일 경우 새로운 배열을 만든 후 배열 요소를 추가합니다. 매우 편한 구조네요!
<?php
$arr = array("A" => 100, "B" => 20);
$arr["C"] = 2000;
var_dump($arr);
?>
아래 결과를 통해 선언과 동시에 요소 추가한 후, 생성된 연관 배열에 새로운 요소 추가가 되는 걸 확인할 수 있습니다.
3.2. 루프를 이용한 연관 배열로의 접근
그렇다면 연관 배열은 어떻게 모든 배열 요소에 접근할까요?
인덱스가 숫자가 아니므로, for문을 사용하여 배열 요소에 접근은 불가능합니다.
대신 foreach문이나 each() 함수를 사용하여 접근해야 합니다.
<?php
$arr = array("A" => 100, "B" => 20, "C" => 30);
echo "foreach 사용<br />";
foreach ($arr as $key => $value) {
echo $key."=>".$value."<br />";
}
echo "<br />";
echo "each 사용<br />";
while($element = each($arr)) {
echo $element["key"]."=>".$element["value"]."<br />";
}
?>
실행 결과를 확인해보면 배열 요소에 접근하는 것을 알 수 있죠?! 😊😊
길었던 배열에 대한 설명이 끝났습니다..! 😂😂
🔗Reference
'PHP' 카테고리의 다른 글
[PHP] 기본 문법 정리 (4) (feat. 함수) (0) | 2021.07.17 |
---|---|
[PHP] 기본 문법 정리 (2) (feat. 연산자, 제어문) (0) | 2021.07.13 |
[PHP] 기본 문법 정리 (1) (0) | 2021.07.12 |
[PHP] 첫 번째 PHP 애플리케이션 생성하기 (0) | 2021.07.12 |
[PHP] PHP Storm 설정 (0) | 2021.07.12 |
블로그의 정보
개발하는 두부
뚜부니