PHP의 서열은 실제로는 순서화된 맵입니다. 맵은 형의 일종으로 값을 키에 연결 짓습니다. 이 형은 다양한 용도에 맞추어 최적화됩니다. 배열뿐만 아니라, 리스트(벡터) 해시 테이블(맵의 실장의 하나), 사전, 컬렉션, 스택, 큐 등으로 사용할 수 있습니다. PHP배열에는 다른 PHP배열을 값으로 유지할 수 있어 매우 쉽게 트리 구조를 표현할 수 있습니다.
이들 데이터 구조에 관한 설명은 본 매뉴얼의 범위를 넘기 때문에 생략합니다만, 각각에 대해서 적어도 하나는 예를 나타냅니다. 이 분야는 광범위에 걸친 다양한 문헌이 존재합니다. 보다 상세한 정보에 대해서는 이들의 문헌을 참조하십시오.
구문
array() 에서 지정
배열 은 언어에 내장된 array() 에서 작성할 수 있습니다. 이 구조는 특정의 수의 쉼표로 구분된 키 값 => 세트를 인수로 합니다.
array(
key => value,
key2 => value2,
key3 => value3,
...
)
마지막 요소 뒤의 쉼표는 써도 안 써도 상관 없습니다. 배열을 문장으로 정의하는 경우는, 보통은 마지막 콤마를 생략합니다. 즉 array(1, 2) 쪽이 array(1, 2, ) 더 추천이라는 것입니다. 그러나 복수행으로 정의하는 경우는 마지막 콤마를 쓰는 것이 일반적입니다. 그러고 두면, 배열의 마지막 요소를 추가하기가 쉽게 되니까요.
PHP 5.4이후는 배열의 단축 구문이 추가되고, array() 대신[] 을 사용할 수 있게 되었습니다.
// PHP 5.4 에서는 이렇게 씁니다
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key 는 정수 또는 문자열입니다. value 에는 임의의 형식을 지정할 수 있습니다.
또 다음과 같은key 캐스트가 발생합니다.
integer 으로 타당한 형식의 문자열은integer 틀에 캐스팅됩니다. 즉, 키를"8" 지정하면 실제로는 8 로 격납된다는 것입니다. 한쪽은"08" 캐스팅되지 않습니다. 이는 십진수로 타당한 형식이 아니기 때문이죠.
floats또한integer 에 캐스트 됩니다. 즉 소수 부분은 버릴 수 있다는 것입니다. 예를 들면 키를8.7 지정하면 실제로는 8 로 저장됩니다.
bool 도integer 에 캐스트 됩니다. 즉 키를true 지정하면 실제로는1 에 저장되고 마찬가지로 키를false 하면 실제로는0 입니다.
Null 는 하늘 문자열로 캐스팅됩니다. 즉, 키에 null 를 지정하면 실제로는"" 으로 저장됩니다.
array 및object 은 키로 사용할 수 없습니다. 키로 사용하다Illegal offset type 는 경고가 발생합니다.
배열 선언 때 같은 키로 여러 요소를 지정하면 마지막으로 지정한 것이 지금까지의 값을 덮어 씁니다.
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
key 는 옵션입니다. 생략한 경우 PHP 는 지금까지 사용된 정수 키 중 최대의 것에 1을 더한 값을 사용합니다.
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
위의 예와 출력은 이하입니다.
string(3) "bar"
int(24)
string(3) "foo"
주의:
뿔 괄호와 파도 괄호는 배열의 요소에 액세스 할 때에는 모두 같은 의미로 사용할 수 있습니다 (즉, 이 예에서$array[42] 와는$array{42} 같은 것을 나타낸다는 것입니다).
PHP 5.4이후는 함수와 메소드의 반환 결과를 직접 서열로 다루게 되었습니다. 예전에는 일단 일차 변수에 대입하지 않는다고 배열로는 다루지 않았습니다.
PHP 5.5이후는 배열 리터럴을 데 참고할 수 있게 되었습니다.
예 7배열의 데빈 레퍼런스
<?php
function getArray() {
return array(1, 2, 3);
}
// PHP 5.4 에서는 이렇게 씁니다.
$secondElement = getArray()[1];
// 전에는 이렇게 하나
$tmp = getArray();
$secondElement = $tmp[1];
// 혹은 이렇게 해야 합니다.
list(, $secondElement) = getArray();
?>
주의:
배열에 정의되지 않은 키에 접근했을 때의 거동은 정의 변수에 접근했을 때와 같습니다. E_NOTICE 메시지가 발행되고 돌려주는 결과는NULL 입니다.
뿔 괄호 구문에서 작성/수정
명시적으로 값을 설정하면 기존의 배열을 수정할 수도 있습니다.
이는 각 괄호 안에 열쇠를 지정하고 배열에 값을 대입함으로써 실시합니다. 키를 생략할 수도 있습니다. 이 경우 하늘 모퉁이 괄호 ("[]")의 변수 이름으로 추가하세요.
$arr[키] = 치;
$arr[] = 치;
// 키는 문자열 또는
//정수의 어느 쪽인가입니다.
//값 의 형은 아무거나 괜찮습니다.
$arr 하지만 아직 존재하지 않으면 새로 만듭니다. 즉 이것은 배열을 만드는 방법의 하나이기도 합니다. 하지만 이 방법을 사용하는 것은 권장하지 않습니다. 왜냐하면 이미 $arr 뭔가 값 (리퀘스트 변수로부터 문자열 등)가 들어 있는 경우에는 그 값이 그대로 남아 [] 하지만 실제로는 문자열 연결 연산자 를 나타내기 때문입니다. 변수를 초기화할 때에는 직접 대입하는 것이 좋습니다.
어떤 값을 변경하려면 새로운 값에 값을 대입합니다. 특정 키/값 세트를 삭제하고자 하는 경우에는 unset() 를 사용할 필요가 있습니다.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 이 스크립트의 이 위치에 기술한 경우.
nbsp; // $arr[13] = 56; 과 같습니다
$arr["x"] = 42; // 키"x"의 새로운 요소를 배열에 추가합니다
unset($arr[5]); // 배열에서 요소를 삭제합니다
unset($arr); // 배열 전체를 삭제합니다
?>
주의:
위와 같이 키를 생략하고 신규 요소를 추가할 경우 추가되는 수치 첨자는 사용되는 첨자 최대치+1(단, 적어도 0이상)이 됩니다. 아직 수치 첨자가 존재하지 않으면 첨자는0 (제로)입니다.
경고
PHP 4.3.0이후 이런 첨자 생성 동작은 변경되었습니다. 현재는 배열에 추가할 때 그 배열의 최대 첨자가 마이너스인 경우는 다음 함께 글씨는 제로 (0)입니다. 예전에는 정규의 첨자의 경우와 마찬가지로 새로운 첨자는 최대 첨자에+1 한 것이 세팅되었습니다.
다음의 키 생성에서 오프셋으로 사용되는 정수 값 (첨자의 최대치)에 대응할 엔트리가 반드시 내부에 존재하는 것은 아님에 주의하세요. 그러나 그 값은 많은 경우 배열에 있는 정수의 키 값의 최대값과 동일한 것입니다. 이하에 예를 나타냅니다.
// 모든 아이템을 삭제합니다만, 배열 자체는 삭제하지 않고 둡니다.
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 아이템을 추가합니다( 새로운 곁들이는 글씨는 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
)
유용한 함수
배열에서 사용하는 편리한 함수가 많이 있습니다. 배열 함수 부분을 참조하십시오.
주의:
unset() 함수는 배열의 키를 삭제할 수 있습니다. 다만 이것에 의해서 인덱스의 재구축이 진행되는 것은 아니기에 주의하세요. "통상의 정수 첨자"(0부터 시작되면서 1씩 증가)만을 사용하고 있는 경우 array_values() 를 사용하여 인덱스를 재구축할 수 있습니다.
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* 이에 따른 배열은 다음과 같이 정의됩니다.
$a = array(1 => 'one', 3 => 'three');
 이하는 아닙니다:
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// $b 은 array(0 => 'one', 1 =>'three')입니다
?>
배열 전용 제어 구조로서foreach 가 있습니다. 이 구조는 배열의 요소에 쉽게 연속적으로 접근하는 수단을 제공합니다.
배열에서 할 일과 해서는 안 되는 것
왜$foo[bar] 는 사용 못하나?
연관 배열의 첨자 전후에는 항상 따옴표로 묶다 필요가 있습니다. 예를 들면,$foo[bar]가 아니라$foo['bar'를 사용하세요. 그러나$foo[bar]은 왜 잘못인가요? 낡은 스크립트에서 다음과 같은 구문을 본 적이 있을지도 모릅니다.
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
이는 잘못되고 있는데 동작합니다. 그럼, 왜 잘못되고 있는 거죠? 그 이유는 이 코드에는 문자열('bar'-따옴표로 묶이고 있다) 아니다 미정의 정수(bar)가 사용되고 있으며 PHP 가 같은 이름의 정수를 불행하게 같은 코드 속에 정의할 가능성이 있기 때문입니다. 하위 호환성 유지를 위한 미정의 정원은 같은 이름의 문자열로 자동적으로 변환됩니다. 그래서 이 코드는 동작합니다. 예컨대bar 라는 이름의 정의되지 않은 정수가 있다면 PHP는'bar' 라는 문자열로 그것을 치환하여 사용합니다.
주의: 이는 첨자를 항상 쿼트겠다는 의미가 없습니다. 상수와 변수 를 첨자로 사용할 때는 쿼트하면 PHP 는 그것을 해석할 수 없게 되어 버립니다.
Checking 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
Bad:
Good: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
Bad:
Good: 1
Checking 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
Bad:
Good: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
Bad:
Good: 2
이 구체 예를 이하에 나타냅니다.
// 올바른
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// 잘못. 이것은 동작하지만 정의 정수 fruit을 사용하기 때문에
// 동시에 E_NOTICE차원의 PHP오류를 발생합니다
//
// 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
// 이하는 문자열 중이기 때문에 OK입니다. 정수는 문자열 중에서는 해석되네
// 때문에 E_NOTICE오류는 여기에서는 발생하지 않습니다.
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 이들을 표시하지 않는 설정이 되고 있습니다.
구문의 절에 기술했듯이 각 괄호 ('['및']') 사이에는식이 없으면 안 됩니다. 이는 다음과 같이 쓸 수 있음을 의미합니다.
<?php
echo $arr[somefunc($bar)];
?>
이는 함수의 반환 값을 배열의 첨자로 사용하는 사례입니다. PHP 는 정수에 대해서도 인식합니다. 이하 같은E_* 사용 예를 본 적이 있을지도 모릅니다.
<?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";
?>
최초의 예bar 와 똑같이 E_ERROR 도 유효한 첨자임에 주의하세요. 그러나 실제로는 마지막 예는 다음과 같이 쓰는 것과 같습니다.
<?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 와 동일한 것 등에 따릅니다.
그럼, 왜$foo[bar] 는 동작하는 것이 가능한 걸까요? 그것은bar 이 상수식임을 기대되는 구문에서 사용되기 때문입니다. 그러나 이 경우 bar 라는 이름의 정원은 존재하지 않습니다. PHP는 이 경우 당신이 문자열"bar" 처럼 리터럴 bar 를 지정했지만 인용 부호를 잊었다고 가정합니다.
그럼, 왜 잘못되고 있는 거죠?
장래적으로 PHP개발 팀이 다른 상수 또는 키워드를 추가할지도 모르고 문제가 될 가능성이 있습니다. 예를 들어, 현재도 단어empty 및 default를 사용할 수 없습니다. 이는 이들이 특별한 예약된 키워드인 때문입니다.
주의: 이중 따옴표로 묶인 문자열 중에서는 따옴표로 배열의 첨자를 안 묶 수 있기 때문에 "$foo[bar]" 는 유효합니다. 이 이유에 대한 자세한 내용은 상기 사례나 문자열 중에서 변수의 버스를 참조하세요.
배열로의 변환
integer, float, string, boolean, resource모든 틀에서도 array 로 변환할 경우 처음의 스칼라 값이 할당되어 있는 하나의 요소(첨자는 0) 를 가진 배열을 얻게 됩니다.
object를 배열할 경우에는 배열의 요소로서 객체의 속성(멤버 변수)을 가진 배열을 얻게 됩니다. 첨자는 멤버 변수 이름이 됩니다만, 몇가지 주의해야 할 예외가 있습니다. 정수의 속성은 접속 불능이 됩니다. private변수의 경우 변수 이름의 머리에 클래스 이름이 붙습니다. 또 protected변수의 경우는 변수 이름의 머리에'*'이 붙습니다. 이때 머리에 추가되는 값의 전후 null바이트가 따라옵니다. 그 결과 뜻밖의 행동을 하는 일이 있습니다.
<?php
class A {
private $A; // 이는 '¥ 0A¥ 0A' 로 됩니다
}
class B extends A {
private $A; // 이는 '¥ 0B¥ 0A' 로 됩니다
public $AA; // 이는 'AA' 로 됩니다
}
var_dump((array) new B());
?>
위의 예에서는'AA'이라는 키가 두개가 있게 보이지만 그 중 하나는 실제로는'¥ 0A¥ 0A'로 됩니다.
NULL 를 배열로 변환하니 하늘의 배열을 얻습니다.
비교
array_diff() 으로 순서 연산자 를 사용하면, 배열을 비교할 수 있습니다.
예
PHP배열형은 여러가지 사용법이 가능합니다. 배열의 강력한 기능을 나타냈기 때문에 여기서 몇가지 예를 소개합니다.
<?php
// 이는
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // 키는 0이 됩니다
);
$b = array('a', 'b', 'c');
// 은 완전히 이것과 같습니다.
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // 키는 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') 혹은 간단히 array('a', 'b', 'c') 로 됩니다
?>
사례 8 array()의 사용 사례
<?php
// 디렉토리에서 모든 아이템을 배열에 대입한다
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
배열에는 순서가 적용되었습니다. 다른 분류 함수를 이용하여 순서를 변경할 수도 있습니다. 보다 상세한 정보에 대해서는 배열 함수 를 참조하십시오. count() 함수를 사용함으로써 배열의 요소 수를 셀 수 있습니다.
사례 13배열의 소트
<?php
sort($files);
print_r($files);
?>
배열의 값은 뭐든지 좋아, 그 값을 다른 배열로 하는 것도 가능합니다. 이로써 귀납적인 배열과 다차원 배열을 작성할 수 있습니다.
// 위의 배열 내용을 취득하기 위한 사례
echo $fruits["holes"][5]; // "second" 을 표시합니다
echo $fruits["fruits"]["a"]; // "orange" 을 표시합니다
unset($fruits["holes"][0]); // "first" 을 삭제합니다
// 새로운 다차원 배열을 작성합니다
$juices["apple"]["green"] = "good";
?>
배열에 대입에서는 항상 값이 복사되는 것에 주의하세요. 배열을 레퍼런스로 복사하는 경우에는 레퍼런스 연산자를 쓸 필요가 있습니다.