Array

본문

PHP 의 Array는 정렬된 맵입니다. 맵은 Key를 값에 연결합니다. Array는 배열, 벡터형 목록, 해시 테이블, 사전, 컬렉션, 스택, 대기열 등의 여러 가지 용도로 사용될 수 있습니다. Array는 다른 Array와 연결된 트리 구성 및 다차원 Array 또한 구성할 수 있습니다.

이러한 데이터 구조에 대한 설명은 이 매뉴얼의 범위를 벗어나지만 각각에 대하여 하나 이상의 예가 제공됩니다. 자세한 내용은 Array의 특정 주제에 관한 부분을 참조하십시오.

문법

array()로 지정

array()를 사용하여 Array를 만들 수 있습니다. 쉼표로 구분된 Key와 값의 쌍을 인수로 사용합니다.

array(
    key => value,
    key2 => value2,
    key3 => value3,
    …
)

Array 마지막 요소 이후의 쉼표는 선택 사항이며 생략 가능합니다. 이는 일반적으로 단일 행 배열을 사용하는 경우 array(1, 2)array(1, 2,)보다 선호됩니다. 반면에 다중 행 배열에는 마지막에 새 요소를 쉽게 추가 할 수 있으므로 마지막 쉼표를 사용합니다.

PHP 5.4이후 array()를 []로 바꾸는 짧은 배열 구문을 사용할 수 있습니다.

Example #1 간단한 Array 정의

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

// PHP 5.4이후 사용 가능합니다.
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

Key는 Integer 또는 String일 수도 있습니다. 값은 모든 유형을 사용할 수 있습니다.

또한 다음과 같은 Key 캐스트가 발생합니다.

  • 숫자 앞에 + 부호가 없는 한 유효한 10진수 Integer를 포함하는 String은 Integer로 캐스트됩니다. 예를 들어 Key “8”은 실제로 8 아래에 저장됩니다. 반면에 “08”은 유효한 10진수가 아니므로 캐스트되지 않습니다.
  • Float 또한 Integer로 캐스트되어 소숫점 아래는 사라집니다. 예를 들어 Key 8.7은 실제로 8 아래에 저장됩니다.
  • Boolean도 Integer로 캐스트됩니다. TRUE Key는 1 아래에 저장되고 FALSE Key는 0 아래에 저장됩니다.
  • Null은 비어있는 문자열로 캐스트됩니다. Key null은 “”(비어있는 문자열) 아래에 저장됩니다.
  • Array와 Object 의 경우 Key로 사용할 수 없습니다. 사용하는 경우 Warning: Illegal offset type 이 나타납니다.

Array의 여러 요소가 동일한 Key를 사용하는 경우 마지막으로 선언된 Key의 값만이 유효합니다. 하나의 Key에는 하나의 값만 사용 가능합니다.

Example #2 형변환과 재선언 예제

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

위 예제는 다음과 같이 출력됩니다.

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

위 예제의 모든 Key는 1로 캐스트되므로 모든 Key는 재선언되고 마지막으로 지정된 Key의 값 “d” 가 유효합니다.

PHP Array는 인덱스 배열과 연관 배열을 구별하지 않으므로 Integer와 String Key를 동시에 포함할 수 있습니다.

Example #3 Integer와 String Key가 혼합된 예제

<?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)
}

Key는 선택사항입니다. 지정하지 않으면 PHP는 이전에 사용한 가장 큰 Integer Key의 값을 증가한 다음 값을 사용합니다.

Example #4 Key 값이 없는 인덱스 예제

<?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"
} 

일부 요소만 Key를 지정하고 다른 요소에 Key를 지정하지 않은 채 남겨둘 수 있습니다.

Example #5 일부 Key 값을 지정하지 않은 예제

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

위 예제는 다음과 같이 출력됩니다.

array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}

마지막 값 “d”에 Key 7이 할당되었습니다. 이전에 사용한 가장 큰 Integer Key가 6이었기 때문입니다.


대괄호를 이용한 Array 액세스

array[key]를 사용하여 Array에 액세스 할 수 있습니다.

Array의 대괄호 안에 Key를 지정하면 값을 할당할 수 있습니다. 비어있는 대괄호를 사용하여 Key 값을 생략할 수 있습니다.

$arr[key] = value;
$arr[] = value;
// Key는 Integer 또는 String일 수 있습니다.
// 값은 모든 유형을 사용할 수 있습니다.

$arr이 아직 존재하지 않는 경우 새롭게 생성되며, 새로운 배열을 만드는 하나의 방법이 될 수 있습니다. 그러나 $arr에 이미 일부 값이 포함되어 있는 경우 기존 값은 해당 위치에 유지되고 대괄호는 String 오프셋 접근을 위한 연산자로 사용되기 때문에 이 방법은 권장하지 않습니다. 항상 직접 할당으로 변수를 초기화하는 것이 좋습니다.

참고 : PHP 7.1.0부터 String에 비어있는 인덱스 연산자를 적용하면 치명적인 오류가 발생합니다. 이전에는 String이 자동으로 Array로 변환되었습니다.

특정 값을 변경하려면 수정이 필요한 값의 Key를 사용하여 새 값을 지정하십시오. Key와 값의 쌍을 제거해야 하는 경우unset()을 사용합니다.

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

$arr[] = 56;    // 이것은 현재 스크립트에서
                // $arr[13] = 56; 과 동일합니다.

$arr["x"] = 42; // 새로운 키 "x"에 값을 등록합니다.
                
unset($arr[5]); // 이렇게 하면 Array에서
                // Key와 해당하는 값의 쌍이 제거됩니다.

unset($arr);    // 이것은 전체 Array를 삭제합니다
?>
참고 : 위에서 언급한 바와 같이, Key를 지정하지 않으면 기존 Integer 인덱스의 최대 값을 사용하며, 새로운 Key는 최대 값에 1을 더한 값(최소값은 0)이 됩니다. Integer 인덱스가 아직 없다면 Key는 0입니다.

이에 사용되는 최대값을 가진 Integer 인덱스의 값은 현재 Array에 명시적으로 존재하지 않습니다. Array의 최대 인덱스 값은 이후에도 일정 시간 동안 Array에 남아 있습니다. 설명에 관한 다음 예제를 참고하십시오.
<?php
// 간단한 Array를 만듭니다.
$array = array(1, 2, 3, 4, 5);
print_r($array);

// 모든 항목을 지웠지만 Array는 아직 남아 있습니다.
foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// 새로운 항목을 추가합니다.
// 값에 대응하는 Key는 0 대신 5부터 시작합니다.
$array[] = 6;
print_r($array);

// 다시 인덱스합니다.
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

위 예제는 다음과 같이 출력됩니다.

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

유용한 기능

Array의 작업에 유용한 기능이 많이 있습니다. Array 함수 항목을 참조하십시오.

참고 : unset()을 사용하면 Array에서 Key를 제거할 수 있습니다. Array는 다시 인덱스되지 않습니다. 진정한 "제거 및 이동"동작이 필요한 경우 array_values()를 사용하여 배열을 다시 순차적으로 인덱스할 수 있습니다.
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/*  $a = array(1 => 'one', 3 => 'three');
    로 정의된 Array를 생성합니다
    Key 값은 특정 Key와 값이 사라진 이후에도
    $a = array(1 => 'one', 2 =>'three');
    와 같이 자동으로 정렬되지 않습니다.
*/

$b = array_values($a);
// 이제 $b의 값은 array(0 => 'one', 1 =>'three') 입니다.
?>

foreach는 Array를 위해 특별히 존재합니다. Array를 탐색하는 쉬운 방법을 제공합니다.


Array에서 주의해야 하는 행동

$ foo[bar]가 왜 잘못되었습니까?

Array의 String 인덱스 주위에는 항상 따옴표를 사용하십시오. 예를 들어 $foo[ ‘bar’]는 정확하지만 $foo[bar]는 정확하지 않습니다. 그러나 이러한 형식들을 스크립트에서 볼 수 있는 이유는 무엇입니까? 오래된 스크립트에서 이런 종류의 구문을 사용하고 있습니다.

이것은 잘못되었지만 동작에는 문제가 없습니다. 그 이유는 이 코드에 String이 아닌 정의되지 않은 상수(bar)가 있기 때문입니다. PHP는 자동으로 정의되지 않은 상수(알려진 기호와 일치하지 않는 따옴표 없는 문자열)를 찾는 경우 String으로 변환합니다. 예를 들어, bar라는 이름의 상수(Constant)가 PHP에 정의되어 있지 않으면 PHP는 문자열 ‘bar’를 대신 사용합니다.

경고 : 정의되지 않은 상수를 String으로 대체하여 취급하는 동작은 PHP 7.2.0부터 더 이상 사용되지 않으며 E_WARNING 레벨의 오류를 출력합니다. 이전에는 E_NOTICE 레벨의 오류가 출력되었습니다.
참고 : 모든 Key를 상수에서 문자로 인용하는 작업을 하는 것은 아닙니다. PHP에서 상수 또는 변수로 사용 중인 Key를 인용하지 마십시오.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Simple array:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
    echo "\n$i번째: \n";
    echo "오류: " . $array['$i'] . "\n";
    echo "정상: " . $array[$i] . "\n";
    echo "오류: {$array['$i']}\n";
    echo "정상: {$array[$i]}\n";
}
?>

위 예제는 다음과 같이 출력됩니다.

0번째: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
오류: 
정상: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
오류: 
정상: 1

1번째: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
오류: 
정상: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
오류: 
정상: 2

위 동작에 관한 예제가 더 있습니다.

<?php
// 모든 에러를 출력합니다.
error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// 옳은 경우
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// 옳지 않은 경우입니다. 동작하고 있지만 E_NOTICE 오류가 발생합니다.
// fruit로 쓰여진 정의되지 않은 상수는 문자열로 바뀌어 동작합니다. 
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// 무슨 일이 일어나고 있는지 설명하기 위하여 
// fruit 상수를 'veggie' 로 정의합니다. 
define('fruit', 'veggie');

// 이제 둘의 차이를 확인할 수 있습니다.
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// 상수는 문자열 내에서 검색되지 않으므로
// 아래 예제에서 E_NOTICE 오류는 발생하지 않습니다.
print "Hello $arr[fruit]";      // Hello apple

// 예외적으로 문자열 내의 Array를 둘러싸는 중괄호를 사용하면
// 상수를 해석할 수 있습니다.
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// 아래는 동작하지 않으며, 이는 전역변수를 사용하는 경우 또한 적용됩니다. 
// 다음과 같은 구문 분석 오류가 발생합니다.
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// 위의 예제를 정상적으로 사용하기 위하여 문자열을 연결합니다.
print "Hello " . $arr['fruit']; // Hello apple
?>

error_reporting()에서 E_ALL 옵션으로 E_NOTICE 수준의 오류를 표시하도록 설정하는 경우 볼 수 있습니다. 기본적으로 error_reporting()의 기본값은 E_NOTICE 수준의 오류를 표시하지 않도록 설정되어 있습니다.

예제에서 설명한 대로 대괄호 안에 있는 것은 표현식이어야 합니다. 즉, 다음과 같은 코드가 작동합니다.

<?php
echo $array[some_function($bar)];
?>

함수 반환 값을 배열 인덱스로 사용하는 예제입니다. PHP에는 몇 가지 정의된 상수가 있습니다.

<?php
$error_descriptions[E_ERROR]   = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>

E_ERROR는 첫 번째 예제의 bar와 마찬가지로 유효한 식별자입니다. 그러나 마지막 예제는 실제로 다음과 같습니다.

<?php
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>

E_ERROR 상수의 값은 1입니다.

그렇다면 왜 나쁜가요?

PHP 팀은 다른 상수 혹은 키워드를 추가할 수도 있으며, 다른 개발자가 만든 코드의 상수가 정의되지 않은 값에 간섭할 수 있습니다. 언제든 상수가 개입할 예외를 남겨두고 있는 값을 실제 상황에서 사용하는 것은 잘못된 방법입니다.


Array로 변환

Integer, Float, String, Boolean, Resource의 경우 값을 Array로 변환하면 인덱스가 0인 단일 요소와 변환된 값이 존재하는 Array가 생성됩니다. 즉, (array)$scalarValue는 array($scalarValue)와 동일하게 동작합니다.

Object가 Array로 변환되면 Object의 속성들은 Array의 요소로 변형됩니다. 멤버 변수의 이름은 Key로 변환됩니다.

예외로 Integer 속성에 액세스 할 수 없습니다. 개인 변수의 이름 앞에는 클래스 이름이 사용됩니다. 보호되는 변수의 이름 앞에 * 연산자가 붙으며, 이름에 널 바이트가 존재합니다. 사용 중 예기치 않은 동작이 발생할 수 있습니다.

<?php

class A {
    private $A; // 바뀌게 될 변수명은 '\0A\0A'입니다.
}

class B extends A {
    private $A; // 바뀌게 될 변수명은 '\0B\0A'입니다.
    public $AA; // 바뀌게 될 변수명은 'AA'입니다.
}

var_dump((array) new B());
?> 

위의 이름에는 ‘AA’라는 두 개의 Key가 있지만 그 중 하나는 ‘\0A\0A’입니다.

NULL을 Array로 변환하면 비어있는 Array가 됩니다.


비교

Array는 array_diff() 및 배열 연산자를 이용하여 비교할 수 있습니다.


예제

PHP Array의 유형은 매우 다양합니다. 몇 가지 예제가 있습니다.

<?php
$a = array( 'color' => 'red',
            'taste' => 'sweet',
            'shape' => 'round',
            'name'  => 'apple',
            4        // Key값은 0이 됩니다.
          );

$b = array('a', 'b', 'c');

// 아래 Array 값의 정의 결과는 위와 동일합니다.
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // Key값은 0이 됩니다.

$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// 코드가 실행되고 난 이후 $a의 값은 다음과 같습니다.
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4)
// $b의 값은 다음과 같습니다.
// array(0 => 'a', 1 => 'b', 2 => 'c'), 또는 간단하게 ('a', 'b', 'c')
?>

Example #8 array() 사용하기

<?php
// Array를 맵으로 사용하는 경우
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'lang'       => 'korean',
              'short_tags' => true
            );
            
// 숫자로 지정되는 Key
$array = array( 7,
                8,
                0,
                156,
                -10
              );
// 위는 다음과 동일합니다. (0 => 7, 1 => 8, ...)

$switching = array(         10, // Key = 0
                    5    =>  6,
                    3    =>  7, 
                    'a'  =>  4,
                            11, // Key = 6
                    '8'  =>  2, // Key = 8 (Integer)
                    '02' => 77, // Key = '02'
                    0    => 12  // 기존의 값 10은 12로 바뀝니다.
                  );
                  
// 비어있는 Array
$empty = array();         
?>

Example #9 컬렉션

<?php
$colors = array('빨간색', '파랑색', '초록색', '노랑색');

foreach ($colors as $color) {
    echo "$color을 좋아하시나요?\n";
}
?>

위 예제는 다음과 같이 출력됩니다.

빨간색을 좋아하시나요?
파랑색을 좋아하시나요?
초록색을 좋아하시나요?
노랑색을 좋아하시나요?

Array의 값을 참조로 전달하여 직접 변경할 수 있습니다.

Example #10 반복문 도중 값 변경하기

<?php
$colors = array('빨간색', '파랑색', '초록색', '노랑색');

foreach ($colors as &$color) {
    $color = '연한 '.$color;
}
unset($color);
print_r($colors);
?>

위 예제는 다음과 같이 출력됩니다.

Array
(
    [0] => 연한 빨간색
    [1] => 연한 파랑색
    [2] => 연한 초록색
    [3] => 연한 노랑색
)

이 예제는 새로운 Array를 만듭니다.

Example #11 인덱스 값을 하나만 지정한 경우

<?php
$element  = array(1 => '동해물과', '백두산이', '마르고 닳도록');
print_r($element);
?>

위 예제는 다음과 같이 출력됩니다.

Array 
(
    [1] => '동해물과'
    [2] => '백두산이'
    [3] => '마르고 닳도록'
)

Example #12 Array에 값 채우기

<?php
// 디렉토리 안 파일들의 이름을 Array에 채워 넣습니다.
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle); 
?>

Array는 정렬되어 있습니다. 다양한 정렬 기능을 사용하여 순서를 변경할 수 있습니다. 자세한 내용은 배열 함수를 참조하십시오. count()는 Array가 가진 키의 개수를 출력합니다.

Example #13 Array 정렬

<?php
sort($files);
print_r($files);
?>

Array의 값은 무엇이든 가능하며, 그 값에 다른 Array를 가지는 것도 가능합니다. 이를 통해 재귀 및 다차원 배열을 만들 수 있습니다.

Example #14 재귀 및 다차원 배열

<?php
$fruits = array ( "fruits"  => array ( "a" => "orange",
                                       "b" => "banana",
                                       "c" => "apple"
                                     ),
                  "numbers" => array ( 1,
                                       2,
                                       3,
                                       4,
                                       5,
                                       6
                                     ),
                  "holes"   => array (      "first",
                                       5 => "second",
                                            "third"
                                     )
                );

// Array에 정의된 값을 확인합니다.
echo $fruits["holes"][5];    // "second" 를 출력합니다.
echo $fruits["fruits"]["a"]; // "orange" 를 출력합니다.
unset($fruits["holes"][0]);  // "first" 를 출력합니다.

// 새로운 다차원 배열을 만듭니다.
$juices["apple"]["green"] = "good"; 
?>

참조 연산자를 사용할 때 Array에 값이 할당되면 참조하는 Array로 할당된 값이 복사됩니다.

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 가 변경되었습니다.
             // $arr1 은 여전히 array(2, 3) 입니다.
             
$arr3 = &$arr1;
$arr3[] = 4; // $arr1 과 $arr3 은 동일합니다.
?>
The source of this document is at PHP.net.   
php  ccl-by-4.0

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다