수색…
소개
배열은 임의의 수의 값을 단일 값으로 저장하는 데이터 구조입니다. PHP의 배열은 실제로 정렬 된 맵입니다. map은 값을 키에 연결하는 유형입니다.
통사론
- $ array = array ( 'Value1', 'Value2', 'Value3'); // 키는 기본적으로 0, 1, 2, ...,
- $ array = array ( 'Value1', 'Value2',); // 선택적 후행 쉼표
- $ array = array ( 'key1'=> 'Value1', 'key2'=> 'Value2',); // 명시 적 키
- $ array = array ( 'key1'=> 'Value1', 'Value2',); // 배열 ([ 'key1'] => Value1 [1] => 'Value2')
- $ array = [ 'key1'=> 'Value1', 'key2'=> 'Value2',]; // PHP 5.4+ 약식
- $ array [] = 'ValueX'; // 배열 끝에 'ValueX'를 추가합니다.
- $ array [ 'keyX'] = 'ValueX'; // 'keyX'키에 'valueX'를 지정합니다.
- $ array + = [ 'keyX'=> 'valueX', 'keyY'=> 'valueY']; // 기존 배열에 요소 추가 / 겹쳐 쓰기
매개 변수
매개 변수 | 세부 묘사 |
---|---|
키 | 키는 배열의 고유 식별자 및 색인입니다. string 또는 integer 수 있습니다. 따라서 유효한 키는 'foo', '5', 10, 'a2b', ... |
값 | 각 key 에는 대응하는 값이 있습니다 (그렇지 않은 경우 는 null , 액세스시에 통지가 발행됩니다 ). 이 값에는 입력 유형에 대한 제한이 없습니다. |
비고
배열 초기화
배열을 초기화 할 수 있습니다. empty :
// An empty array
$foo = array();
// Shorthand notation available since PHP 5.4
$foo = [];
배열은 값으로 초기화되고 미리 설정 될 수 있습니다 :
// Creates a simple array with three strings
$fruit = array('apples', 'pears', 'oranges');
// Shorthand notation available since PHP 5.4
$fruit = ['apples', 'pears', 'oranges'];
배열은 사용자 정의 색인 (연관 배열이라고도 함)을 사용하여 초기화 할 수도 있습니다.
// A simple associative array
$fruit = array(
'first' => 'apples',
'second' => 'pears',
'third' => 'oranges'
);
// Key and value can also be set as follows
$fruit['first'] = 'apples';
// Shorthand notation available since PHP 5.4
$fruit = [
'first' => 'apples',
'second' => 'pears',
'third' => 'oranges'
];
변수가 이전에 사용되지 않았다면 PHP는 자동으로 변수를 생성합니다. 편리하기는하지만 이렇게하면 코드를 읽기가 더 어려워 질 수 있습니다.
$foo[] = 1; // Array( [0] => 1 )
$bar[][] = 2; // Array( [0] => Array( [0] => 2 ) )
색인은 일반적으로 중단했던 위치에서 계속됩니다. PHP는 숫자 문자열을 정수로 사용하려고합니다.
$foo = [2 => 'apple', 'melon']; // Array( [2] => apple, [3] => melon )
$foo = ['2' => 'apple', 'melon']; // same as above
$foo = [2 => 'apple', 'this is index 3 temporarily', '3' => 'melon']; // same as above! The last entry will overwrite the second!
고정 된 크기로 배열을 초기화하려면 SplFixedArray
를 사용할 수 있습니다.
$array = new SplFixedArray(3);
$array[0] = 1;
$array[1] = 2;
$array[2] = 3;
$array[3] = 4; // RuntimeException
// Increase the size of the array to 10
$array->setSize(10);
참고 : SplFixedArray
를 사용하여 만든 배열은 많은 데이터 집합에 대해 메모리 사용 공간이 줄어들지 만 키는 정수 여야합니다.
동적 인 크기이지만 n
비어 있지 않은 요소 (예 : 자리 표시 자)로 배열을 초기화하려면 다음과 같이 루프를 사용할 수 있습니다.
$myArray = array();
$sizeOfMyArray = 5;
$fill = 'placeholder';
for ($i = 0; $i < $sizeOfMyArray; $i++) {
$myArray[] = $fill;
}
// print_r($myArray); results in the following:
// Array ( [0] => placeholder [1] => placeholder [2] => placeholder [3] => placeholder [4] => placeholder )
모든 자리 표시자가 동일하면 array_fill()
함수를 사용하여 자리 표시자를 만들 수도 있습니다.
배열 array_fill (int $ start_index, int $ num, mixed $ value)
이렇게하면 start_index
에서 시작하는 num
개의 value
항목이있는 배열이 만들어지고 반환됩니다.
참고 : start_index
가 음수이면 음수 인덱스로 시작하고 다음 요소에 대해 0부터 계속됩니다.
$a = array_fill(5, 6, 'banana'); // Array ( [5] => banana, [6] => banana, ..., [10] => banana)
$b = array_fill(-2, 4, 'pear'); // Array ( [-2] => pear, [0] => pear, ..., [2] => pear)
결론 : array_fill()
을 사용하면 실제로 수행 할 수있는 작업에 대한 제한이 더 array_fill()
집니다. 루프는보다 유연하며 다양한 기회를 열어줍니다.
숫자 범위 (예 : 1-4)로 채워진 배열을 원할 때마다 모든 단일 요소를 배열에 추가하거나 range()
함수를 사용할 수 있습니다.
배열 범위 (mixed $ start, mixed $ end [, number $ step = 1])
이 함수는 요소 범위를 포함하는 배열을 만듭니다. 처음 두 매개 변수가 필요하며 여기에서 (포함 된) 범위의 시작 및 끝 지점을 설정합니다. 세 번째 매개 변수는 선택 사항이며 수행되는 단계의 크기를 정의합니다. stepsize
가 1
인 range
를 0
에서 4
로 만들면 결과 배열은 0
, 1
, 2
, 3
및 4
요소로 구성됩니다. 스텝 사이즈가 2
(즉, range(0, 4, 2)
)로 증가하면 결과 배열은 0
, 2
, 4
됩니다.
$array = [];
$array_with_range = range(1, 4);
for ($i = 1; $i <= 4; $i++) {
$array[] = $i;
}
print_r($array); // Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
print_r($array_with_range); // Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
range
는 정수, 부동 소수점, 정수형으로 캐스트되는 부울 (boolean) 및 문자열로 작업 할 수 있습니다. 그러나 부동 소수점 정밀도 문제로 인해 float를 인수로 사용할 때는주의해야합니다.
키가 있는지 확인하십시오.
array_key_exists()
또는 isset()
또는 !empty()
.
$map = [
'foo' => 1,
'bar' => null,
'foobar' => '',
];
array_key_exists('foo', $map); // true
isset($map['foo']); // true
!empty($map['foo']); // true
array_key_exists('bar', $map); // true
isset($map['bar']); // false
!empty($map['bar']); // false
isset()
은 null
값의 요소를 존재하지 않는 것으로 취급합니다. 반면 !empty()
는 false
와 같은 모든 요소에 대해 동일한 작업을 수행합니다 (예 : null
, ''
및 0
은 모두 !empty()
의해 false로 처리됨). while isset($map['foobar']);
true
!empty($map['foobar'])
는 false
입니다. 이것은 실수로 이어질 수 있습니다 (예를 들어, 문자열 '0'
이 false로 취급된다는 것을 잊기 쉽습니다) !empty()
은 종종 눈살을 찌푸리게됩니다.
또한 $map
이 전혀 정의되어 있지 않으면 isset()
과 !empty()
가 작동하고 false를 반환합니다. 이로 인해 사용자는 다소 오류가 발생하기 쉽습니다.
// Note "long" vs "lang", a tiny typo in the variable name.
$my_array_with_a_long_name = ['foo' => true];
array_key_exists('foo', $my_array_with_a_lang_name); // shows a warning
isset($my_array_with_a_lang_name['foo']); // returns false
서수 배열을 확인할 수도 있습니다.
$ord = ['a', 'b']; // equivalent to [0 => 'a', 1 => 'b']
array_key_exists(0, $ord); // true
array_key_exists(2, $ord); // false
isset()
은 array_key_exists()
보다 성능이 좋으며 후자는 함수이고 이전에는 언어 구조이기 때문에주의하십시오.
array_key_exists()
의 별칭 인 key_exists()
사용할 수도 있습니다.
배열에 값이 있는지 확인하기
in_array()
함수는 배열에 항목이 있으면 true를 반환합니다.
$fruits = ['banana', 'apple'];
$foo = in_array('banana', $fruits);
// $foo value is true
$bar = in_array('orange', $fruits);
// $bar value is false
array_search()
함수를 사용하여 배열의 특정 항목의 키를 가져올 수도 있습니다.
$userdb = ['Sandra Shush', 'Stefanie Mcmohn', 'Michael'];
$pos = array_search('Stefanie Mcmohn', $userdb);
if ($pos !== false) {
echo "Stefanie Mcmohn found at $pos";
}
당신이 사용할 수있는 PHP 5.5 이상에서 array_column()
과 함께 array_search()
.
이것은 연관 배열에 값이 있는지 확인하는 데 특히 유용합니다.
$userdb = [
[
"uid" => '100',
"name" => 'Sandra Shush',
"url" => 'urlof100',
],
[
"uid" => '5465',
"name" => 'Stefanie Mcmohn',
"pic_square" => 'urlof100',
],
[
"uid" => '40489',
"name" => 'Michael',
"pic_square" => 'urlof40489',
]
];
$key = array_search(40489, array_column($userdb, 'uid'));
배열 유형 유효성 검사
is_array()
함수는 변수가 배열이면 true를 반환합니다.
$integer = 1337;
$array = [1337, 42];
is_array($integer); // false
is_array($array); // true
매개 변수 유형을 적용하는 함수에 hint 배열 유형을 입력 할 수 있습니다. 다른 것을 전달하면 치명적인 오류가 발생합니다.
function foo (array $array) { /* $array is an array */ }
gettype()
함수를 사용할 수도 있습니다.
$integer = 1337;
$array = [1337, 42];
gettype($integer) === 'array'; // false
gettype($array) === 'array'; // true
ArrayAccess 및 Iterator 인터페이스
또 다른 유용한 기능은 PHP에서 배열로 사용자 정의 객체 컬렉션에 액세스하는 것입니다. 이를 지원하기 위해 PHP (> = 5.0.0) 코어에서 사용할 수있는 두 개의 인터페이스 ArrayAccess
와 Iterator
있습니다. 전자는 배열로 사용자 정의 객체에 액세스 할 수 있습니다.
ArrayAccess
모든 사용자를 저장하는 사용자 클래스와 데이터베이스 테이블이 있다고 가정합니다. 우리는 다음과 같은 UserCollection
클래스를 만들고 싶습니다.
- 특정 사용자를 사용자 이름 고유 식별자로 처리하도록 허용
- 사용자 컬렉션에서 기본 (모든 CRUD는 아니지만 최소한 만들기, 검색 및 삭제) 작업 수행
다음 소스를 고려하십시오 (이하 버전 5.4 이후에 사용 가능한 짧은 배열 생성 구문 []
사용합니다).
class UserCollection implements ArrayAccess {
protected $_conn;
protected $_requiredParams = ['username','password','email'];
public function __construct() {
$config = new Configuration();
$connectionParams = [
//your connection to the database
];
$this->_conn = DriverManager::getConnection($connectionParams, $config);
}
protected function _getByUsername($username) {
$ret = $this->_conn->executeQuery('SELECT * FROM `User` WHERE `username` IN (?)',
[$username]
)->fetch();
return $ret;
}
// START of methods required by ArrayAccess interface
public function offsetExists($offset) {
return (bool) $this->_getByUsername($offset);
}
public function offsetGet($offset) {
return $this->_getByUsername($offset);
}
public function offsetSet($offset, $value) {
if (!is_array($value)) {
throw new \Exception('value must be an Array');
}
$passed = array_intersect(array_values($this->_requiredParams), array_keys($value));
if (count($passed) < count($this->_requiredParams)) {
throw new \Exception('value must contain at least the following params: ' . implode(',', $this->_requiredParams));
}
$this->_conn->insert('User', $value);
}
public function offsetUnset($offset) {
if (!is_string($offset)) {
throw new \Exception('value must be the username to delete');
}
if (!$this->offsetGet($offset)) {
throw new \Exception('user not found');
}
$this->_conn->delete('User', ['username' => $offset]);
}
// END of methods required by ArrayAccess interface
}
다음을 할 수 있습니다.
$users = new UserCollection();
var_dump(empty($users['testuser']),isset($users['testuser']));
$users['testuser'] = ['username' => 'testuser',
'password' => 'testpassword',
'email' => '[email protected]'];
var_dump(empty($users['testuser']), isset($users['testuser']), $users['testuser']);
unset($users['testuser']);
var_dump(empty($users['testuser']), isset($users['testuser']));
코드를 실행하기 전에 testuser
가 없다고 가정하면 다음과 같이 출력됩니다.
bool(true)
bool(false)
bool(false)
bool(true)
array(17) {
["username"]=>
string(8) "testuser"
["password"]=>
string(12) "testpassword"
["email"]=>
string(13) "[email protected]"
}
bool(true)
bool(false)
중요 : array_key_exists
함수를 사용하여 키가 있는지 확인하면 offsetExists
가 호출되지 않습니다. 따라서 다음 코드는 false
두 번 출력합니다.
var_dump(array_key_exists('testuser', $users));
$users['testuser'] = ['username' => 'testuser',
'password' => 'testpassword',
'email' => '[email protected]'];
var_dump(array_key_exists('testuser', $users));
반복자
foreach
와 while
을 사용하여 iterating 할 수 있도록 Iterator
인터페이스의 몇 가지 함수를 사용하여 위에서 클래스를 확장 해 보겠습니다.
먼저 iterator의 현재 색인을 포함하는 속성을 추가해야합니다. $_position
과 같은 클래스 속성에 추가해 보겠습니다.
// iterator current position, required by Iterator interface methods
protected $_position = 1;
둘째, 클래스에 의해 구현되는 인터페이스 목록에 Iterator
인터페이스를 추가해 보겠습니다.
class UserCollection implements ArrayAccess, Iterator {
그런 다음 인터페이스 함수 자체에서 필요한 것을 추가하십시오.
// START of methods required by Iterator interface
public function current () {
return $this->_getById($this->_position);
}
public function key () {
return $this->_position;
}
public function next () {
$this->_position++;
}
public function rewind () {
$this->_position = 1;
}
public function valid () {
return null !== $this->_getById($this->_position);
}
// END of methods required by Iterator interface
그래서 여기 모두가 두 인터페이스를 구현하는 클래스의 완전한 소스입니다. 이 예제는 완벽하지는 않습니다. 왜냐하면 데이터베이스의 ID가 순차적이지 않을 수도 있기 때문입니다. 그러나 이것은 ArrayAccess
및 Iterator
인터페이스를 구현하여 가능한 한 객체 컬렉션을 처리 할 수 있습니다.
class UserCollection implements ArrayAccess, Iterator {
// iterator current position, required by Iterator interface methods
protected $_position = 1;
// <add the old methods from the last code snippet here>
// START of methods required by Iterator interface
public function current () {
return $this->_getById($this->_position);
}
public function key () {
return $this->_position;
}
public function next () {
$this->_position++;
}
public function rewind () {
$this->_position = 1;
}
public function valid () {
return null !== $this->_getById($this->_position);
}
// END of methods required by Iterator interface
}
모든 사용자 객체를 반복하는 foreach :
foreach ($users as $user) {
var_dump($user['id']);
}
어떤 것을 출력 할 것인가?
string(2) "1"
string(2) "2"
string(2) "3"
string(2) "4"
...
변수 배열 만들기
$username = 'Hadibut';
$email = '[email protected]';
$variables = compact('username', 'email');
// $variables is now ['username' => 'Hadibut', 'email' => '[email protected]']
이 방법은 프레임 워크에서 종종 두 구성 요소간에 변수 배열을 전달하는 데 사용됩니다.