수색…


소개

배열은 임의의 수의 값을 단일 값으로 저장하는 데이터 구조입니다. 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])

이 함수는 요소 범위를 포함하는 배열을 만듭니다. 처음 두 매개 변수가 필요하며 여기에서 (포함 된) 범위의 시작 및 끝 지점을 설정합니다. 세 번째 매개 변수는 선택 사항이며 수행되는 단계의 크기를 정의합니다. stepsize1range0 에서 4 로 만들면 결과 배열은 0 , 1 , 2 , 34 요소로 구성됩니다. 스텝 사이즈가 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.x 5.5

당신이 사용할 수있는 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) 코어에서 사용할 수있는 두 개의 인터페이스 ArrayAccessIterator 있습니다. 전자는 배열로 사용자 정의 객체에 액세스 할 수 있습니다.

ArrayAccess

모든 사용자를 저장하는 사용자 클래스와 데이터베이스 테이블이 있다고 가정합니다. 우리는 다음과 같은 UserCollection 클래스를 만들고 싶습니다.

  1. 특정 사용자를 사용자 이름 고유 식별자로 처리하도록 허용
  2. 사용자 컬렉션에서 기본 (모든 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));

반복자

foreachwhile 을 사용하여 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가 순차적이지 않을 수도 있기 때문입니다. 그러나 이것은 ArrayAccessIterator 인터페이스를 구현하여 가능한 한 객체 컬렉션을 처리 할 수 ​​있습니다.

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]']

이 방법은 프레임 워크에서 종종 두 구성 요소간에 변수 배열을 전달하는 데 사용됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow