Boolean

본문

Boolean은 가장 간단한 자료형으로 논리적 표현을 사용합니다. TRUE 혹은 FALSE 둘 중 하나의 값을 가집니다.

문법

Boolean의 값은 TRUE, FALSE를 사용합니다. 지정하는 값은 대소문자를 구분하지 않습니다.

 <? php
$ foo = True; // TRUE 값을 $ foo에 할당
?>  

일반적으로 연산자를 이용하여 반환된 Boolean은 제어 구조로 전달됩니다.

<?php
// == 는 테스트를 위한 연산자입니다.
// 값이 같다면 boolean을 반환합니다.
if ($action == "show_version") {
    echo "현재 버전은 1.23입니다.";
}

// 아래와 같은 연산은 필요하지 않습니다.
if ($show_separators == TRUE) {
    echo "<hr>\n";
}

// 아래의 연산은 바로 위의 예제와 동일하게 동작합니다.
// 위 예제와 동일한 상황에서 == 연산자를 생략할 수 있습니다. 
if ($show_separators) {
    echo "<hr>\n";
}
?>

Boolean으로 변환하기

(bool) 또는 (boolean) 캐스트를 이용하여 Boolean으로 명시적인 변환이 가능합니다. 그러나 연산자, 함수, 제어 구조에 Boolean이 필요한 경우 값이 자동으로 변환되므로 대부분의 경우 캐스트가 필요하지 않습니다.

자동 형변환을 참조하십시오.

Boolean으로 변환할 때 다음 값은 FALSE로 간주됩니다.

  • Boolean FALSE
  • Integer 0 또는 -0(영)
  • Float 0.0 또는 -0.0(영)
  • 비어있는 String 또는 String “0”
  • 요소가 없는 Array
  • 특수 유형 NULL (설정되지 않은 변수 포함)
  • 비어있는 태그에서 생성된 SimpleXML 객체

다른 모든 값은 TRUE (Resource 및 NaN 포함)로 간주됩니다.

경고 : -1은 다른 0이 아닌 값(음수 또는 양수)과 함께 TRUE로 간주됩니다!
<?php
var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)
?>         
The source of this document is at PHP.net.   
php  ccl-by-4.0

Integer

본문

Integer는 소수점을 포함하지 않는 0을 포함한 음수와 양수입니다.

참조 :

  • 임의 길이 정수/GMP
  • Float
  • 임의 정밀도/BCMath

문법

Integer는 Decimal(10진), Hexadecimal(16진), Octal(8진), Binary(2진) 표기법으로 지정할 수 있습니다. 부정 연산자 -는 음수의 표현으로 사용합니다.

Binary(2진) 표기법은 PHP 5.4.0부터 사용할 수 있습니다.

Octal(8진) 표기법을 사용하려면 숫자 앞에 0을, Hexadecimal(16진) 표기법을 사용하려면 숫자 앞에 0x를 붙이십시오. Binary(2진) 표기법을 사용하려면 숫자 앞에 0b를 붙이면 됩니다.

Example #1 Integer의 표기법

<?php
$ a = 1234;       // Decimal(10진)
$ a = 0123;       // Octal(8진), Demical 83
$ a = 0x1A;       // Hexadecimal(16진), Demical 26
$ a = 0b11111111; // Binary(2진), Demical 255
?> 

공식적인 Integer의 표기 구조는 다음과 같습니다.

Decimal     : [1-9][0-9]*
            | 0

Hexadecimal : 0[xX][0-9a-fA-F]+

Octal       : 0[0-7]+

Binary      : 0[bB][01]+

Integer     : Decimal
            | Hexadecimal
            | Octal
            | Binary

Integer의 크기는 플랫폼에 따라 다르지만 32비트 플랫폼을 기준으로 최대 231 – 1 의 값을 지정할 수 있습니다. 32비트를 사용하는 PHP 7 이전의 Windows를 제외한 64비트 플랫폼의 Integer의 크기는 최대 263 – 1입니다. PHP는 부호 없는 Integer를 지원하지 않습니다. Integer의 크기를 위한 PHP_INT_SIZE와, PHP 5.0.5 이후 PHP_INT_MAX를 사용하여 최대 값을, PHP 7.0.0 이후 PHP_INT_MIN을 사용하여 최소값을 지정할 수 있습니다.

경고 : PHP 7 이전에는 유효하지 않은 숫자(8 또는 9)가 Octal(8진) 표기법으로 제공되면 나머지 숫자는 무시되었습니다. PHP 7부터 구문 분석 오류가 발생합니다.

Integer 오버플로우

PHP가 Integer의 범위를 벗어나는 숫자를 발견하면 Float로 해석됩니다. Integer의 범위를 초과하는 숫자를 생성하는 연산은 Float를 반환합니다.

Example #2 32비트 시스템의 Integer 오버플로우

<?php
$large_number = 2147483647;
var_dump($large_number); // Integer 2147483647

$large_number = 2147483648;
var_dump($large_number); // Float 2147483648

$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // Float 50000000000
?>

Example #3 64비트 시스템의 Integer 오버플로우

<?php
$large_number = 9223372036854775807;
var_dump($large_number); // Integer  9223372036854775807

$ large_number = 9223372036854775808;
var_dump($large_number); // Float 9.2233720368548E + 18

$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // Float 5.0E + 19
?>

PHP에는 Integer를 위한 나누기 연산자가 없습니다. 1/2은 Float 0.5를 산출합니다. 값을 0으로 반올림하기 위해 정수로 캐스트할 수 있습니다. 또한 round() 함수를 이용하여 반올림을 보다 세밀하게 제어할 수 있습니다.

참고 : PHP 7.0.0부터 Integer를 나누기 위한  intdiv() 함수를 사용할 수 있습니다. 
<?php
    var_dump(25/7);         // Float 3.5714285714286
    var_dump((int) (25/7)); // Int 3
    var_dump(round(25/7));  // Float 4
?>

(int) 또는 (integer) 캐스트를 이용하여 Integer로 명시적인 변환이 가능합니다. 그러나 연산자, 함수, 제어 구조에 Integer가 필요한 경우 값이 자동으로 변환되므로 대부분의 경우 캐스트가 필요하지 않습니다. intval() 함수를 사용하여 값을 Integer로 변환할 수도 있습니다.

Resource가 Integer로 변환되면 결과는 런타임시 PHP에 의해 Resource에 할당된 고유한 리소스 번호를 가집니다.

자동 형변환을 참조하십시오.

Integer로 변환

Boolean에서 변환

FALSE는 0으로, TRUE는 1의 값을 가집니다.

Float에서 변환

FloatInteger로 변환하는 경우 소수점 아래의 숫자는 반올림됩니다.

FloatInteger의 경계를 벗어나면 (일반적으로 32 비트 플랫폼의 경우 231 – 1, Windows 이외의 64 비트 플랫폼의 경우 263 – 1) 결과는 정의되지 않습니다. Float는 정확한 Integer의 결과를 제공하기에 충분한 정밀도를 갖지 않기 때문입니다. 위와 같은 상황은 경고가 표시되지 않습니다!

참고 : PHP 7.0.0부터 플랫폼에 상관없이 NaN또는 Infinity 값을 가진 변수를 Integer로 캐스트한다면 결과는 항상 0이 출력됩니다.
경고 :  정의되지 않은 분수를 가진 계산을 Integer로 직접 캐스트하지 마십시오. 때로는 예기치 않은 결과가 발생할 수 있습니다.
<?php
    echo (int) ( (0.1+0.7) * 10 ); // 결과값으로 7이 출력됩니다!
?>

Float의 정밀도에 대한 경고를 함께 참조하십시오.

String에서 변환

String을 Integer로 변환을 참조하십시오.

NULL에서 변환

NULL은 항상 0으로 변환됩니다.

다른 유형에서 변환

경고 : Integer로 변환하는 동작은 다른 유형에 대하여 정의되어 있지 않습니다. 예고없이 변경될 수 있으므로 관찰된 행동에 의존하지 마십시오.
The source of this document is at PHP.net.   
php  ccl-by-4.0

Float

본문

Float 부동 소수점 숫자(“float”, “double” 또는 “real number”라고도 합니다)는 다음 구문 중 하나를 사용하여 지정할 수 있습니다.

<?php
    $a = 1.234;
    $b = 1.2e3;
    $c = 7E-10;
?>

공식적인 Float의 표기 구조는 다음과 같습니다.

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM}

Float의 크기는 플랫폼에 따라 다르지만 대략 14자리의 정밀도로 최대 약 1.8e308(64비트 IEEE 형식)이 일반적인 값입니다.

Float의 정밀도

Float는 정밀도가 제한되어 있습니다. PHP는 시스템에 따라 다르지만 일반적으로 IEEE 754 배정도 형식을 사용하는 과정에서 1.11e-16 순서의 반올림으로 최대 상대 오류가 발생합니다. 기본이 아닌 산술 연산은 더욱 큰 오차를 줄 수 있으며, 여러 연산이 복합되는 경우 오류 전파를 고려해야 합니다.

또한 0.1 또는 0.7과 같이 10 진수의 값으로 정확하게 표현할 수 있는 유리수는 가수의 크기에 상관없이 내부에서 사용되는 2진수의 Float로 정확하게 표현되지 않습니다. 예를 들어 floor ((0.1 + 0.7) * 10)은 일반적으로 예상하는 값인 8 대신 7을 반환합니다. 내부 표현은 7.9999999999999991118과 비슷하기 때문입니다.

IEEE 754 표준을 참조하십시오. (외부 링크)

String을 Float으로 변환하는 방법에 대한 자세한 내용은 String을 Integer로 변환을 참조하십시오. 다른 유형의 값을 변환하는 경우 Integer로 변환된 값이 Float로 다시 한번 변환됩니다. 자세한 내용은 Integer로 변환을 참조하십시오. PHP 5부터 Object가 Float로 변환되면 알림이 발생합니다.

Float의 비교

위에서 언급한 내용과 같이 Float의 값이 동일한지 테스트하는 것은 내부적으로 표현되는 방식으로 인해 문제를 일으킬 가능성이 있습니다. 그러나 이러한 제한을 해결하는 Float의 값을 비교하는 방법이 있습니다.

Float의 값이 같은지 테스트하기 위해 반올림으로 인한 상대 오류의 상한이 사용됩니다. 이 값을 머신 엡실론 또는 단위 반올림이라고하며 계산에서 허용되는 가장 작은 차이입니다.

$a$b 는 5자리의 정밀도입니다.

<?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;

    if(abs($a-$b) < $epsilon) {
        echo "true";
    }
?>

NaN

일부 숫자 연산은 상수 NaN으로 표시되는 값을 초래할 수 있습니다. 이 결과는 Float를 이용하는 계산에서 정의되지 않거나 표현할 수 없는 값을 나타냅니다. TRUE를 제외한 경우에서 NaN 자신을 포함하여 다른 값과 비교하는 경우 값을 느슨하거나 엄격하게 비교하면 FALSE를 출력합니다.

NaN은 여러 개의 다른 값을 나타내므로 NaN은 자신을 포함하여 다른 값과 비교해서는 안되며 대신 is_nan()을 사용하여 확인해야 합니다.

The source of this document is at PHP.net.   
php  ccl-by-4.0

String

본문

String은 일련의 문자이며 문자는 1바이트와 같습니다. PHP는 기본적으로 256자 세트를 지원하며 유니코드 지원은 포함되지 않습니다. String 유형에 대한 세부 사항을 참조하십시오.

참고 : PHP 7.0.0부터 64비트 빌드에서 String 길이에 제한을 두지 않습니다. 32비트 빌드 및 이전 버전에서 String은 최대 2GB(최대 2147483647 바이트)입니다.

문법

String은 네 가지 방법으로 지정할 수 있습니다.

  • 작은 따옴표
  • 큰 따옴표
  • Heredoc 구문
  • Nowdoc 구문 (PHP 5.3.0부터)

작은 따옴표

String을 지정하는 가장 간단한 방법은 작은 따옴표(‘)로 묶는 것입니다.

작은 따옴표를 문자로 사용하려면 백슬래시(\) 문자를 앞에 입력합다. 백슬래시를 문자로 사용하려면 두 번(\\)입력합니다. 문자로 사용된 백슬래시는 이스케이프 문자로 사용되지 않습니다. 이는 \r 또는 \n 과 같이 익숙한 다른 이스케이프 시퀀스가 ​​특별한 의미를 가지지 않고 지정된 대로 출력됨을 의미합니다.

참고 : 큰 따옴표 및 Heredoc 구문과 달리 특수 문자의 변수 및 이스케이프 시퀀스는 작은 따옴표로 묶인 String에서 사용되지 않습니다.
<?php
echo '이것은 간단한 문장입니다.';

echo '작은 따옴표를 이용하여
줄바꿈을 표현할 수도 있습니다.
정상적으로 동작합니다.';

// 출력: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// 출력: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 출력: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 출력: 이스케이프 시퀸스는 사용되지 않습니다: \n 새로운 줄
echo '이스케이프 시퀸스는 사용되지 않습니다: \n 새로운 줄';

// 출력: 작은 따옴표는 전처리 없이 동작합니다: $expand $either
echo '작은 따옴표는 전처리 없이 동작합니다: $expand $either';
?>           

큰 따옴표

String이 큰 따옴표로 묶인 경우 PHP는 특수 문자에 대해 다음 이스케이프를 해석합니다.

SequenceMeaning
\n줄바꿈 (LF or 0x0A (10) in ASCII)
\r캐리지 리턴 (CR or 0x0D (13) in ASCII)
\t가로 탭 (HT or 0x09 (9) in ASCII)
\v세로 탭 (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\e이스케이프 (ESC or 0x1B (27) in ASCII) (since PHP 5.4.4)
\f폼 피드 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\백슬래시 문자 \
\$달러 문자 $
\”큰 따옴표 문자 “
\[0-7]{1,3}정규 표현식과 일치하는 문자는 8진수 표기법으로 해석됩니다.
\x[0-9A-Fa- f]{1,2}정규 표현식과 일치하는 문자는 16진수 표기법으로 해석됩니다.
\u{[0-9A-Fa-f]+}정규 표현식과 일치하는 문자는 유니코드 코드 포인트이며, 코드 포인트의 UTF-8 표현으로 String에 출력됩니다 (PHP 7.0.0에서 추가됨)

작은 따옴표로 묶인 String과 같이 위 표에 지정되지 않은 다른 문자를 이스케이프하면 백슬래시도 인쇄됩니다. PHP 5.1.1 이전에는 문자 앞의 백슬래시가 인쇄되지 않았습니다.

큰 따옴표로 묶인 String의 가장 중요한 특징으로 변수 이름을 지정하여 사용 가능합니다. 자세한 내용은 String 구문 분석을 참조하십시오.


Heredoc

String을 구분하는 세 번째 방법은 Heredoc 구문입니다. <<< 연산자 뒤에 식별자와 줄바꿈을 사용할 수 있습니다. String을 사용한 다음 동일한 식별자가 다시 인용 부호를 닫습니다.

닫는 식별자는 줄의 첫번째 열에서 시작해야 합니다. 또한 식별자는 PHP의 다른 레이블과 동일한 이름 지정 규칙을 따라야 합니다. 영숫자와 밑줄만 포함해야 하며 숫자로 시작할 수 없습니다.

경고 : 닫는 식별자가 있는 행은 세미콜론을 제외한 다른 문자를 포함해서는 안됩니다. 닫는 식별자를 사용하는 도중 들여쓰기할 수 없으며, 세미콜론의 앞뒤에 공백이나 탭이 없어야 합니다. 닫는 식별자 앞의 첫 문자는 항상 줄바꿈으로 시작해야 합니다. macOS를 포함한 UNIX 시스템에서는 \n 입니다.

닫는 식별자가 이 규칙에 위반되는 경우 PHP는 오류가 있는 행을 처리하지 않으며 계속해서 유효한 닫는 식별자를 찾습니다. 파일이 끝나기 전에 올바른 닫기 식별자를 찾지 못하면 마지막 행에 구문 분석 오류가 발생합니다.

Example #1 잘못된 방법

<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
// 식별자는 들여쓰기할 수 없습니다.
?>

Example #2 올바른 방법

<?php
class foo {
    public $bar = <<<EOT
bar
EOT;
}
?>

PHP 5.3부터 내부의 값에 변수를 포함하는 Heredoc은 클래스 속성을 초기화하는 데 사용할 수 없습니다.

Example #4 올바르지 않은 Heredoc 클래스 사용

<?php
class foo {
    public $bar = <<<EOT
    content $variable // {$variable} 변수가 있다면 오류가 발생합니다.
EOT;
}

$j = new foo();
echo $j->bar;
?> 

Heredoc은 큰 따옴표 없이 큰 따옴표로 묶인 문자열처럼 작동합니다. 따라서 Heredoc 안에서 따옴표를 이스케이프할 필요 없이 위에 나열된 이스케이프 코드를 계속 사용할 수 있습니다. 변수를 사용할 수 있으므로 Heredoc 내부에서 문자열과 복잡한 변수가 함께 사용되는 경우 주의를 기울여야 합니다.

Example #4 Heredoc 문자열 사용 예제

<?php
$str = <<<EOD
문자열의 예
여러 줄에 걸친
heredoc을 사용합니다. 
EOD;

/* 변수를 포함한 더욱 복잡한 예제 */
class foo
{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = '김철수';

echo <<<EOT
저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: \x41
EOT;
?>

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

저의 이름은 "김철수" 입니다. 저는 Foo 를 출력합니다.
이번에는 Bar2 를 출력합니다.
이것은 문자 'A'를 출력합니다: A

Heredoc을 사용하여 데이터를 함수 인수에 전달할 수도 있습니다.

Example #5 Heredoc 인수 사용 예제

<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>

PHP 5.3.0부터 Heredoc을 사용하여 정적 변수와 클래스 속성 및 상수를 초기화할 수 있습니다.

Example #6 Heredoc을 이용한 초기화

<?php
// Static variables
function foo()
{
    static $bar = <<<LABEL
Nothing in here...
LABEL;
}

// Class properties/constants
class foo
{
    const BAR = <<<FOOBAR
Constant example
FOOBAR;

    public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>

PHP 5.3.0부터 Heredoc 식별자의 이름을 선택적으로 큰 따옴표로 묶을 수 있습니다.

Example #7 Heredoc 큰 따옴표 사용

<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>

Nowdoc

Nowdoc은 큰 따옴표로 묶인 문자열로 처리되는 Heredoc과 달리 작은 따옴표로 묶인 문자열로 처리됩니다. Nowdoc은 Heredoc과 유사하게 지정되지만 Nowdoc 내에서는 구문 분석이 수행되지 않습니다. 구문은 이스케이프 처리없이 PHP 코드 또는 기타 길이가 긴 문장을 포함하는 데 이상적입니다. 구문 분석용이 아닌 문장을 선언한다는 점에서 SGML <![CDATA []]>와 공통되는 일부 기능을 공유합니다.

Nowdoc은 Heredoc에 사용된 것과 동일한 <<< 시퀀스를 사용하지만 뒤에 오는 식별자는 작은 따옴표로 묶습니다. (<<< ‘EOT’) Nowdoc에도 Heredoc에 대한 모든 규칙이 동일하게 적용됩니다.

Example #8 Nowdoc 문자열 사용 예제

<?php
echo <<<'EOD'
여러 줄에 걸친 문자열의 예
Nowdoc을 사용합니다. 백슬래시는 문자 그대로 보여집니다.
예제, \\ 와 \'.
EOD;

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

여러 줄에 걸친 문자열의 예
Nowdoc을 사용합니다. 백슬래시는 문자 그대로 보여집니다.
예제, \\ 와 \'.

Example #9 Nowdoc을 이용한 변수와 문자열 사용

<?php
class foo
{
    public $foo;
    public $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = '김철수';

echo <<<'EOT'
저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: A: \x41
EOT;
?>

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

저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: A: \x41

Example #10 Nowdoc을 이용한 초기화

<?php
class foo {
    public $bar = <<<'EOT'
bar
EOT;
}
?>
참고 : Nowdoc은 PHP 5.3.0이후부터 동작합니다.     

변수 분석

큰 따옴표나 Heredoc으로 문자열을 지정하면 변수가 그 안에서 해석됩니다.

간단한 구문과 복잡한 구문, 두 가지 유형이 있습니다. 간단한 구문이 가장 일반적이고 편리합니다. 최소한의 노력으로 변수, 배열 값 또는 객체 속성을 문자열에 포함킬 수 있습니다.

복잡한 구문은 중괄호로 표현식을 묶어서 사용합니다.

간단한 구문

달러 기호($)가 사용된 이후 PHP는 [a-zA-Z_]+[a-zA-Z0-9_]* 정규 표현식에 해당하는 문자열(UTF-8 특수문자 또한 변수 이름으로 사용될 수 있습니다)을 유효한 변수 이름을 만들기 위하여 사용합니다. 명시적으로 이름의 끝을 지정하고자 하는 경우 중괄호로 변수 이름을 묶습니다.

<?php
$juice = "apple";

echo "He drank some $juice juice.".PHP_EOL;
// 유효하지 않습니다. "s"는 변수 이름에 유효하지만 변수는 $juice입니다.
echo "He drank some juice made of $juices.".PHP_EOL;
// 유효합니다. 사용하고자 하는 변수명을 중괄호로 묶어 명시적으로 지정합니다.
echo "He drank some juice made of ${juice}s.".PHP_EOL;
?>
참고 : PHP_EOL은 줄바꿈 문자와 동일한 역할으로 사용됩니다.

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

He drank some apple juice.
He drank some juice made of .
He drank some juice made of apples.

유사한 방법으로 Array 인덱스 또는 객체 속성을 분석합니다. Array 인덱스의 경우 닫는 대괄호(])는 인덱스의 끝을 표시합니다. 간단한 구문괴 동일한 규칙이 객체 속성에 적용됩니다.

Example #11 간단한 구문 예제

<?php
$juices = array("apple", "orange", "koolaid1" => "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;

class people {
    public $john = "John Smith";
    public $jane = "Jane Smith";
    public $robert = "Robert Paulsen";

    public $smith = "Smith";
}

$people = new people();

echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // 동작하지 않음
?>

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

He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
John Smith drank some apple juice.
John Smith then said hello to Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen greeted the two .

PHP 7.1.0 이후 음수 인덱스도 지원됩니다.

Example #12 음수 인덱스

<?php
$string = 'string';
echo "문자열의 -2번째 인덱스는 $string[-2]입니다.", PHP_EOL;
$string[-3] = 'o';
echo "문자열의 -3번째 인덱스를 o로 바꾸면 ${string}이 됩니다.", PHP_EOL;
?>

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

문자열의 -2번째 인덱스는 n입니다.
문자열의 -3번째 인덱스를 o로 바꾸면 strong이 됩니다.

더욱 복잡한 변수를 출력하기 위하여 복잡한 구문을 사용합니다.

복잡한 구문

구문이 복잡하기 때문에 어렵고 복잡한 내용이 아닙니다. 위의 일반적인 예제들보다 복잡한 표현을 사용할 수 있기 때문입니다.

String이 있는 스칼라 변수, 배열 요소 또는 객체 속성은 이 구문을 통해 포함될 수 있습니다. String 외부에서 사용하는 것과 같은 방식으로 표현식을 작성한 다음 중괄호로 줄바꿈하면 됩니다. 여는 중괄호는 단독으로 이스케이프 할 수 없으며, 이 구문은 달러 문자가 중괄호 바로 앞에 오는 경우에만 인식됩니다. 문자 {$을 얻으려면 {\$를 사용하십시오. 이에 관한 몇 가지 예제가 있습니다.

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

// 동작하지 않습니다. This is { fantastic}
echo "This is { $great}";

// 동작합니다. This is fantastic
echo "This is {$great}";

// 동작합니다.
echo "This square is {$square->width}00 centimeters broad.";

// 동작합니다. 키를 인용하는 경우 중괄호 구문을 사용해야 합니다.
echo "This works: {$arr['key']}";

// 동작합니다.
echo "This works: {$arr[4][3]}";

// $arr[foo]가 잘못되었습니다.
// 동작하는 구문이지만 PHP가 먼저 foo 이름을 가진 상수를 찾아야만 합니다.
// E_NOTICE (undefined constant) 오류가 발생합니다. 
echo "This is wrong: {$arr[foo][3]}";

// 동작합니다. 다차원 배열을 사용하는 경우 문자열 내부에서는
// 항상 배열 주위에 중괄호를 사용해야 합니다.
echo "This works: {$arr['foo'][3]}";

// 동작합니다.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): ${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// 동작하지 않습니다. This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

이 구문을 사용하여 문자열 내의 변수를 클래스 속성에 대입할 수도 있습니다.

<?php
class foo {
    var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[3]}}\n";
?>

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

I am bar.
I am quux.
참고 : 중괄호 내부의 함수, 메소드 호출, 정적 클래스 변수 및 클래스 상수는 PHP 5부터 사용됩니다. 그러나 반환된 값은 문자열의 범위 내에서 변수의 이름으로 해석됩니다. 중괄호를 사용하여 함수, 메서드의 반환 값, 클래스 상수, 정적 클래스 변수의 값에 직접 액세스할 수 없습니다.
<?php
// 모든 에러를 출력합니다.
error_reporting(E_ALL);

class beers {
    const softdrink = 'rootbeer';
    public static $ale = 'ipa';
}

$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';

// 동작합니다. I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";

// 아래 구문 또한 동작합니다. I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>

문자별 String 읽기와 수정

String 내의 문자는 $str[42] 와 같이 Array의 대괄호를 이용하여 String 다음에 원하는 문자의 0부터 시작하는 오프셋을 지정하여 읽고 수정할 수 있습니다. 오프셋을 지정한 String은 문자 Array로 사용 가능합니다. substr(), substr_replace()는 둘 이상의 문자를 추출하거나 바꾸려고 할 때 사용할 수 있습니다.

참고 : PHP 7.1.0부터 음수 String 오프셋도 지원됩니다. String 끝에서 반대 방향으로 오프셋을 지정합니다.  PHP 7.1.0 이전에는 음수 오프셋이 읽기(비어있는 String)를 위한 E_NOTICE 와 쓰기(String을 그대로 둔 상태)를 위한 E_WARNING 오류를 출력했습니다. 
참고 : String 오프셋을 만들기 위한 목적으로 $str{42}와 같이 중괄호를 이용할 수도 있습니다. 
경고 : 범위를 벗어난 오프셋에 문자를 쓰면 문자열이 공백으로 채워집니다. 정수가 아닌 유형은 정수로 변환됩니다. 잘못된 오프셋 유형은 E_WARNING을 방출합니다. 할당된 문자열의 첫 문자만 사용됩니다. PHP 7.1.0부터 빈 문자열을 할당하면 치명적인 오류가 발생합니다. 이전에는 NULL 바이트를 할당했습니다. 
경고 : 내부적으로 PHP 문자열은 바이트 배열입니다 ISO-8859-1과 같은 1바이트 인코딩으로 된 문자열에서만 자료에 오프셋 접근을 이용할 수 있으며, 멀티 바이트 문자를 이용하는 경우 배열 괄호를 사용하여 문자열을 읽고 수정하는 경우 자료의 손상을 일으킬 수 있습니다.
참고 : PHP 7.1.0부터 빈 문자열에 빈 인덱스 연산자를 적용하면 치명적인 오류가 발생합니다. 이전에는 빈 문자열이 자동으로 배열로 변환되었습니다.

Example #13 String 오프셋 예제

<?php
// String의 첫번째 오프셋을 읽습니다.
$str = 'This is a test.';
$first = $str[0];

// String의 세번째 오프셋을 읽습니다. 
$third = $str[2];

// String의 마지막 오프셋을 읽습니다. 
$str = 'This is still a test.';
$last = $str[strlen($str)-1];

// String의 마지막 오프셋을 수정합니다. 
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>

PHP 5.4에서 String 오프셋은 Integer 또는 Integer로 변환 가능한 String이어야 합니다. 그렇지 않으면 경고가 발생합니다. 이전에는 “foo”와 같은 오프셋이 자동으로 0으로 캐스트되었습니다.

Example #14 PHP 5.3과 PHP 5.4의 차이점

<?php
$str = 'abc' ;

var_dump ( $str [ '1' ]);
var_dump (isset( $str [ '1' ]));

var_dump ( $str [ '1.0' ]);
var_dump (isset( $str [ '1.0' ]));

var_dump ( $str [ 'x' ]);
var_dump (isset( $str [ 'x' ]));

var_dump ( $str [ '1x' ]);
var_dump (isset( $str [ '1x' ]));
?>

위 예제는 PHP 5.3에서 다음과 같이 출력됩니다.

string(1) "b"
bool(true)
string(1) "b"
bool(true)
string(1) "a"
bool(true)
string(1) "b"
bool(true)

위 예제는 PHP 5.4에서 다음과 같이 출력됩니다.

string(1) "b"
bool(true)

Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)

Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
참고 : [] 또는 {}를 사용하여 다른 유형의 변수(적절한 인터페이스를 구현하는 배열이나 객체는 포함하지 않음)에 액세스하면 자동으로 NULL이 반환됩니다.
참고 : PHP 5.5는 [] 또는 {}를 사용하여 String의 문자에 액세스할 수 있는 지원이 추가되었습니다. 

유용한 기능과 연산자

String은 ‘.’을 사용하여 연결할 수 있습니다. ‘+’ 연산자는 문자열을 연결하지 않습니다. 자세한 정보는 String연산자를 참조하십시오.

String 조작에 유용한 함수가 많이 있습니다.

일반 함수는 String 함수, 고급 찾기 및 바꾸기 기능은 Perl 호환 정규식 함수를 참조하십시오.

URL String을 인코딩, 디코딩할 수 있는 기능(Sodium 및 Hash)도 있습니다.

마지막으로 문자 유형 함수도 참조하십시오.


String으로 변환

(String) 캐스트 또는 strval()을 사용하여 값을 String으로 변환 할 수 있습니다. String 변환은 String이 필요한 표현식의 범위에서 자동으로 수행됩니다. echo 또는 print를 사용하거나 변수를 String과 비교할 때 발생 합니다. 유형과 형변환, settype()을 참조하십시오.

Boolean TRUE 값은 String “1”로 변환됩니다. Boolean FALSE는 “”(비어있는 문자열)로 변환됩니다. 이를 통해 Boolean 값과 String 값 사이를 전환할 수 있습니다.

Integer와 Float는 문자로 변환된 숫자를 나타내는 문자열로 변환됩니다(Float의 지수 부분 포함). Float는 지수 표기법(4.1E+6)을 사용하여 변환할 수 있습니다.

참고 : 소수점 문자는 스크립트의 로케일(범주 LC_NUMERIC)에 정의됩니다. setlocale()을 참조하십시오.

Array는 항상 문자열 Array로 변환됩니다. 이 때문에 echo 및 print 자체는 Array의 내용을 표시 할 수 없습니다. 단일 요소를 보려면 echo $array[‘foo’]와 같은 구성을 사용하십시오. 전체 내용을 보는 방법은 아래를 참조하십시오.

Object를 String 매직 메소드로 변환하려면 __toString을 사용해야 합니다.

Resource는 항상 구조 “Resource id #1″를 사용하여 String으로 변환되며, 여기서 1은 런타임시 PHP가 Resource에 할당한 Resource 번호입니다. 그러나 변환된 String의 정확한 구조에 의존해서는 안 되며 변경될 수 있습니다. 스크립트가 실행되는 동안(예: 웹 요청 또는 CLI 프로세스) 지정된 Resource 번호는 변경되지 않는 고유한 값을 지니며 재사용되지 않습니다. Resource의 형식을 얻으려면 get_resource_type()을 사용합니다.

NULL은 항상 빈 문자열로 변환됩니다.

위에서 설명한 것처럼 Array, Object, Resource를 String으로 직접 변환해도 해당 형식 이외의 값에 대한 유용한 정보는 제공되지 않습니다. 이러한 형식의 내용을 보다 효과적으로 검사하기 위하여 print_r() var_dump()를 참조하십시오.

영구 저장을 위해 대부분의 PHP 값을 문자열로 변환 할 수도 있습니다. 이 메소드를 직렬화라고하며 serialize()에 의해 수행됩니다.


String을 Integer 또는 Float로 변환

String을 Integer 또는 Float로 변환하여 사용하는 경우 결과 값과 유형은 다음과 같이 결정됩니다.

문자열에 ‘.’, ‘e’ 또는 ‘E’ 문자가 포함되어 있지 않고 숫자 값이 정수 형식 제한(PHP_INT_MAX에 정의됨)에 맞으면 String은 Integer로 평가됩니다. 다른 모든 경우에는 Float로 평가됩니다.

값은 String의 초기 부분에 의해 지정됩니다. String이 유효한 숫자 데이터로 시작하면 변환된 값이 Integer 또는 Float로 사용됩니다. 유효하지 않은 값의 경우 0(0)을 출력합니다. 유효한 숫자 데이터는 맨 앞에 양수 및 음수를 지정하기 위한 기호가 포함될 수 있습니다. 문맥에 따라 소수점이 사용될 수 있는 하나 이상의 숫자로 구성되고, 필요한 경우 지수를 사용할 수도 있습니다. 지수는 ‘e’ 또는 ‘E’이며 그 뒤에 하나 이상의 숫자로 구성됩니다.

<?php
$foo = 1 + "10.5";                // $foo는 Float입니다. (11.5)
$foo = 1 + "-1.3e3";              // $foo는 Float입니다. (-1299)
$foo = 1 + "bob-1.3e3";           // $foo는 Integer입니다. (1)
$foo = 1 + "bob3";                // $foo는 Integer입니다. (1)
$foo = 1 + "10 Small Pigs";       // $foo는 Integer입니다. (11)
$foo = 4 + "10.2 Little Piggies"; // $foo는 Float입니다. (14.2)
$foo = "10.0 pigs " + 1;          // $foo는 Float입니다. (11)
$foo = "10.0 pigs " + 1.0;        // $foo는 Float입니다. (11)
?>

이 변환에 대한 자세한 내용은 Strtod에 대한 유닉스 매뉴얼 페이지(3)를 참조하십시오.

이곳의 예제를 테스트하려면 위 예제를 잘라내어 줄 위에 붙여넣은 다음 결과를 확인합니다.

<?php
echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";
?>

C언어와 같이 한 문자를 정수로 변환하는 작업은 불가능합니다. ord()chr()을 사용하여 ASCII 코드와 문자 간의 교환이 가능합니다.


String의 세부 사항

PHP의 String은 바이트 배열과 버퍼 길이를 나타내는 정수로 구현됩니다. 해당 바이트가 문자로 변환되는 방법에 대한 정보가 없으므로 해당 작업이 필요한 경우 프로그래머에가 직접 구현해야 합니다. String을 구성할 수 있는 값에는 제한이 없습니다. 특히, 값이 0인 바이트(“NUL 바이트”)는 문자열의 어느 곳에서나 허용됩니다. (이 매뉴얼에서 Binary safe가 아닌 몇 가지 함수는 NUL 바이트 이후의 데이터가 사용되지 않는 String을 라이브러리에 넘겨 줄 수 있습니다.)

String의 특성은 PHP에 별도의 바이트 유형이 없는 이유를 설명합니다. String이 단일 바이트의 역할을 수행합니다. 텍스트 데이터를 반환하지 않는 함수(예를 들면, 네트워크 소켓에서 읽은 임의의 데이터)는 여전히 String을 반환합니다.

PHP가 String에 대한 특정 인코딩을 지시하지 않는다면 사용되는 String이 어떻게 인코딩되는지 궁금할 것입니다. 예를 들어 문자열 “á”는 “\xE1” (ISO-8859-1), “\xC3\xA1” (UTF-8, C형식), “\x61\xCC\x81” (UTF-8, D형식), 또는 기타 다른 표현들이 사용될 수 있습니다. 답은 String이 스크립트 파일에 인코딩된 방식으로 인코딩된다는 것입니다. 따라서 스크립트가 ISO-8859-1로 작성된 경우 String은 ISO-8859-1으로 인코딩됩니다.

Zend Multibyte가 활성화 된 경우 스크립트는 임의의 인코딩(명시적으로 선언되거나 감지된 인코딩)으로 작성된 다음 특정 내부 인코딩으로 변환될 수 있으며, 스크립트 인코딩은 String에 사용됩니다.

스크립트 인코딩(또는 Zend Multibyte가 활성화 된 경우 내부 인코딩)은 UTF-8 또는 ISO-8859와 같은 ASCII의 상위 호환 집합을 사용해야 하는 제약이 있습니다. 하지만 동일한 바이트 값이 초기 및 비 초기 시프트 상태에서 사용될 수 있는 파일의 초기 상태에 의존하는 인코딩 지정은 문제가 될 수 있습니다.

String을 이용하여 작동하는 함수들이 긍정적으로 사용되기 위하여 String이 인코딩되는 방식에 대해 몇 가지 가정을 해야 할 수 있습니다. 불행히도 PHP의 함수 전반에 걸쳐 이 문제에 많은 변화가 필요합니다.

  • 일부 함수는 String이 일부 단일 바이트 인코딩으로 인코딩된다고 가정하지만 해당 바이트를 특정 문자로 해석할 필요는 없습니다. 예를 들어 substr(), strpos(), strlen(), strcmp()의 경우 함수를 이용하지 않고 메모리 버퍼에 접근하여 바이트 및 바이트 오프셋으로 작동할 수도 있습니다.
  • 다른 함수는 문자열의 인코딩을 전달하며, 이러한 정보가 제공되지 않으면 기본값으로 간주됩니다. 이것은 htmlentities() 및 mbstring 확장을 이용하는 함수들의 경우입니다.
  • strcasecmp(), strtoupper(), ucfirst()의 경우 지정된 로케일을 사용하지만(setlocale() 참조)바이트 단위로 작동합니다. 이는 인코딩이 로케일과 일치하는 단일 바이트 인코딩에만 사용할 수 있습니다. 예를 들어, 로케일이 올바르게 설정되고 á가 단일 바이트로 인코딩 된 경우 strtoupper(“á”)는 “Á”를 리턴할 수 있습니다. UTF-8로 인코딩된 경우 지정된 로케일에 따라 String이 손상되거나 리턴되지 않을 수 있습니다.
  • 마지막으로, String이 특정 인코딩(일반적으로 UTF-8)을 사용한다고 가정할 수 있습니다. 이것은 intl 확장과 PCRE 확장의 기능입니다(마지막의 경우 u수정자를 사용하는 경우에만). 이는 특수한 목적으로 인한 것이지만 utf8_decode()는 UTF-8 인코딩을 가정하고 utf8_encode()는 ISO-8859-1 인코딩을 가정합니다.

궁극적으로, 즉 유니코드를 사용하여 올바른 프로그램을 작성하는 것은 일반적으로 intl 및 bstring 확장에서 정상적으로 동작하는 함수를 필요에 따라 선택적으로 사용함과 동시에 동작하지 않는 함수를 회피하는 것입니다. 그러나 유니코드 인코딩을 처리할 수 있는 함수를 사용하는 것은 시작에 불과합니다. 언어가 제공하는 기능에 관계없이 유니코드 사양을 아는 것이 필수적입니다. 예를 들어, 스크립트 내에서 사용되는 문자가 대문자와 소문자만 있다고 가정하는 프로그램은 잘못된 가정을 하고 있습니다.

The source of this document is at PHP.net.   
php  ccl-by-4.0

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