카테고리 없음

PHP 배열

백위한 2024. 5. 13. 19:46

배열(array)

 

PHP에서 배열(array)은 맵(map)으로 이루어진 순서가 있는 집합을 의미함

맵(map)은 값을 키에 연결하는 타입.

맵(map)은 한쌍의 키(key)와 값(value)으로 이루어짐

배열을 구성하는 각각의 맵을 배열 요소(array element)라고 함.

 

PHP 배열의 종류

1. 1차원 배열

2. 다차원 배열

3. 연관 배열

 

 

PHP에서는 array() 함수를 이용해 배열을 생성함.

쉼표로 구분된 키 => 값 쌍을 원하는 수만큼 인자로 받음.

배열 이름은 배열을 선언한 후 해당 배열에 접근하기 위해 사용

$배열이름 = array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

 

마지막 배열 요소 뒤의 쉼표는 선택 사항이며 생략할 수 있음.

일반적으로 한 줄 배열의 경우 array(1, 2)가 array(1, 2, )보다 선호됨.

여러 줄 배열의 경우 끝에 새 요소를 쉽게 추가할 수 있으므로 일반적으로 후행 쉼표가 사용됨.

 

array()를 []로 대체하는 짧은 배열 구문이 있음.

 

매개변수의 배열을 반환함.

매개변수에는 => 연산자를 사용하여 인덱스를 지정할 수 있음.

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// Using the short array syntax
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

 

키는 정수 혹은 문자열일 수 있음.

값은 모든 유형이 될 수 있음.

 

키 형변환 발생.

숫자 앞에 + 기호가 없는 경우 유효한 십진수가 포함된 String은 int 유형으로 변환됨.

Float도 int로 변환됨. 소수점 이하 부분은 잘림.

Bool도 int로 변환됨. ture는 1 밑으로, false는 0 밑으로 저장됨.

Null은 빈 문자열로 저장됨. null 키는 "" 아래에 저장됨.

배열과 객체는 키로 사용할 수 없음. 그렇게 하면 Illegal offset type 오류 발생.

 

배열을 선언할 때 여러 요소가 동일한 키를 사용하는 경우 다른 요소를 모두 덮어쓰기 때문에 마지막 요소만 사용됨.

 

<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
?>

 

 

위 코드를 실행할 경우 모든 키가 1로 변환되고 모든 새 요소가 값을 덮어써서 마지막으로 할당된 값 'd'만 남게 됨.

array(1) {
  [1]=>
  string(1) "d"
}

 

PHP 배열은 인덱스 배열과 연관 배열을 구분하지 않으므로 int 키와 문자열 키를 동시에 포함할 수 있음.

 

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
    100   => -100,
    -100  => 100,
);
var_dump($array);
?>

 

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

 

배열 요소의 참조

 

PHP에서는 배열 요소에 접근하기 위해 인덱스(index)를 사용함.

PHP는 0부터 시작하는 숫자 인덱스를 지원함.

 

배열의 각 요소를 참조하고 싶을 때는 [] 연산자를 사용.

 

$배열이름[인덱스]

 

PHP에서는 인덱스로 숫자뿐만 아니라 문자열을 사용할 수도 있음

 

인덱스로 문자열을 사용하는 배열을 연관 배열(associative array)이라고 함

 

 

배열 요소의 추가

 

PHP에서는 인덱스를 이용하여 배열에 요소를 추가할 수 있음.

 

배열을 생성하고 인덱스를 이용하여 배열 요소를 추가하는 예제

$arr = array();     // 배열 생성
$arr[0] = "apple";  // 배열 요소 추가
$arr[1] = "banana";
$arr[2] = "orange";

 

배열을 생성하면서 동시에 배열 요소를 초기화할 수 있음.

 

$배열이름 = array(배열요소1, 배열요소2, ...);

 

초기화 리스트에 따라 각각의 배열 요소가 순서대로 추가된 배열이 생성됨.

 

배열 생성과 동시에 초기화하는 예제

 

$arr = array("apple", "banana", "orange");  // 배열 생성과 동시에 초기화

 

만약 해당 배열이 존재하지 않으면, 해당 이름으로 새로운 배열을 만든 후에 배열 요소를 추가함.

 

$arr[0] = "apple";  // 배열이 존재하지 않으므로, 먼저 배열을 생성한 후에 요소가 추가됨.
$arr[1] = "banana";
$arr[2] = "orange";

 

이때 배열 요소의 인덱스를 생략할 수 있음.

인덱스를 생략하면 인덱스가 0부터 시작하여 1씩 증가하며 순서대로 저장됨.

 

$arr[] = "apple";  // 배열 인덱스를 생략하여, 순서대로 배열에 추가됨.
$arr[] = "banana";
$arr[] = "orange";

 

코드를 명확하게 하고 오류를 피하기 위해서는 배열을 먼저 선언해 주는 것이 바람직함.

 

키는 선택 사항임.

키를 지정하지 않으면 PHP는 이전에 사용된 가장 큰 int 키의 증분을 사용함.

 

<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>

 

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}

 

 

배열의 홀(hole)

 

PHP에서는 배열의 특정 인덱스에만 배열 요소를 추가할 수 있음.

 

$arr = array();            // 배열의 생성

$arr[10] = "banana";       // 인덱스 10에만 배열 요소를 추가함.

 

var_dump($arr);

var_dump($arr[0]);         // NULL

var_dump(isset($arr[0]));  // false

var_dump(isset($arr[10])); // true

 

위의 예제에서 배열 요소가 존재하는 인덱스는 10뿐. 나머지 인덱스에는 배열 요소가 존재하지 않음.

인덱스에 대응하는 배열 요소가 없는 부분을 배열의 홀(hole)이라고 함.

PHP에서 배열의 홀(hole)을 참조하면 초기화되지 않은 변수를 참조할 때처럼 NULL을 반환함.

 

isset() 함수는 인수로 전달받은 변수가 초기화되어 있는지를 확인해줌.

 

 

특정 값을 변경하려면 키를 사용하여 해당 요소에 새 값을 할당함.

키/값 쌍을 제거하려면 해당 키/값 쌍에서 unset() 함수를 호출함.

 

<?php
$arr = array(5 => 1, 12 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42; // This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>

 

루프를 이용한 배열로의 접근

 

for문을 사용하면 배열의 인덱스를 이용하여 배열 요소에 접근할 수 있음.

 

$arr = array("apple", "banana", "orange");
for($i = 0; $i < count($arr); $i++){
    echo $arr[$i]."<br>";
}

 

count() 함수는 배열의 모든 요소의 개수를 반환함.

 

홀(hole)을 가지는 배열에서는 for문을 사용하면 모든 배열 요소에 접근할 수 없음.

이때는 foreach문을 사용하여 배열 요소에 접근.

 

$arr = array(); // 배열의 생성 

$arr[2] = "apple";

$arr[3] = "banana";

$arr[4] = "orange";

// $arr[0]과 $arr[1]은 배열의 홀(hole)이 됨.

 

for ($i = 0; $i < count($arr); $i++) {

    echo "\\$arr[{$i}] : ".$arr[$i]."<br>";

}

 

foreach ($arr as $element){

    echo $element."<br>";

}

 

count() 함수는 배열 요소의 개수를 계산할 때 배열의 홀(hole)을 포함하지 않음.

따라서 홀을 가지는 배열에서는 정확한 배열의 길이를 구할 수 없음.

foreach문을 사용하면 홀이 아닌 배열 요소에만 정확히 접근할 수 있음.

 

 

배열 요소는 array[key] 구문을 사용하여 접근할 수 있음.

 

<?php
$array = array(
    "foo" => "bar",
    42    => 24,
    "multi" => array(
         "dimensional" => array(
             "array" => "foo"
         )
    )
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

 

string(3) "bar"
int(24)
string(3) "foo"

 

 

PHP 8.0.0 이전에는 배열 요소에 접근할 때 대괄호와 중괄호를 서로 바꿔서 사용할 수 있었음.

중괄호 구문은 PHP 7.4.0부터 사용되지 않으며 PHP 8.0.0부터 지원되지 않음.

 

<?php
$source_array = ['foo', 'bar', 'baz'];

[$foo, $bar, $baz] = $source_array;

echo $foo;    // prints "foo"
echo $bar;    // prints "bar"
echo $baz;    // prints "baz"
?>

 

배열은 [] 또는 list() 구문을 사용하여 구조체를 분해할 수 있음.

배열을 개별 변수로 분해할 수 있음.

 

배열 파괴는 다자원 배열을 반복하는 동안 foreach를 사용할 수 있음.

 

<?php
$source_array = [
    [1, 'John'],
    [2, 'Jane'],
];

foreach ($source_array as [$id, $name]) {
    // logic here with $id and $name
}
?>

 

변수가 제공되지 않으면 배열 요소는 무시됨.

배열 해체는 항상 인덱스 0에서 시작함.

 

<?php
$source_array = ['foo', 'bar', 'baz'];

// Assign the element at index 2 to the variable $baz
[, , $baz] = $source_array;

echo $baz;    // prints "baz"
?>

 

PHP 7.1.0부터는 연관 배열도 구조를 파괴할 수 있음.

인덱스를 명시적으로 지정할 수 이ㅆ음.

 

<?php
$source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3];

// Assign the element at index 'baz' to the variable $three
['baz' => $three] = $source_array;

echo $three;    // prints 3

$source_array = ['foo', 'bar', 'baz'];

// Assign the element at index 2 to the variable $baz
[2 => $baz] = $source_array;

echo $baz;    // prints "baz"
?>

 

<?php
$a = 1;
$b = 2;

[$b, $a] = [$a, $b];

echo $a;    // prints 2
echo $b;    // prints 1
?>

 

unset() 함수를 사용하면 배열에서 키를 제거할 수 있음.

배열은 재색인되지 않는다는 점을 유의.

제거 및 이동이 필요한 경우 array_values() 함수를 사용하여 배열을 다시 색인화할 수 있음.

 

<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* will produce an array that would have been defined as
   $a = array(1 => 'one', 3 => 'three');
   and NOT
   $a = array(1 => 'one', 2 =>'three');
*/

$b = array_values($a);
// Now $b is array(0 => 'one', 1 =>'three')
?>

 

 

 

String 리터럴 배열 인덱스는 따옴표로 감싸야 함.

예를 들어 $foo['bar']는 맞지만 $foo[bar]는 틀림.

상수나 변수인 키를 따옴표로 묶으면 PHP가 해석하지 못함.

큰따옴표로 묶인 문자열 안에서는 배열 인덱스를 따옴표로 묶지 않아도 유효하므로 "$foo[bar]"는 유효함.

 

 

array_diff() 함수 및 배열 연산자를 사용하여 배열을 비교할 수 있음.

 

 

 

 

참고한 글

https://www.tcpschool.com/php/php_array_basic

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://www.php.net/manual/en/language.types.array.php

 

PHP: Arrays - Manual

'd']; //['a', 'b', 'c' => 'd']?>

www.php.net

https://www.php.net/manual/en/function.array

 

PHP: array - Manual

The following function (similar to one above) will render an array as a series of HTML select options (i.e. " ... "). The problem with the one before is that there was no way to handle , so this function solves that issue.function arrayToSelect($option, $s

www.php.net