Основы массивов в PHP
Создание массивов
<?php
declare(strict_types=1);
// Short syntax (recommended)
$fruits = ['apple', 'banana', 'cherry'];
// Long syntax (legacy)
$fruits = array('apple', 'banana', 'cherry');
// Empty array
$empty = [];
// Associative array
$user = [
'name' => 'Alice',
'age' => 25,
'active' => true,
];
// Mixed keys
$mixed = [
'name' => 'Alice',
0 => 'zero',
'items' => [1, 2, 3],
];
// Trailing comma (allowed since PHP 7.3)
$config = [
'host' => 'localhost',
'port' => 3306, // Trailing comma is OK
];
Индексация и ключи
Автоматическая индексация
<?php
declare(strict_types=1);
// Auto-indexed (starts from 0)
$arr = ['a', 'b', 'c'];
// [0 => 'a', 1 => 'b', 2 => 'c']
// Custom starting index
$arr = [5 => 'a', 'b', 'c'];
// [5 => 'a', 6 => 'b', 7 => 'c']
// Next auto-index = max(existing keys) + 1
// Gap in keys
$arr = [0 => 'a', 5 => 'b', 'c'];
// [0 => 'a', 5 => 'b', 6 => 'c']
// Adding elements
$arr = [];
$arr[] = 'first'; // Key 0
$arr[] = 'second'; // Key 1
$arr[10] = 'tenth'; // Key 10
$arr[] = 'next'; // Key 11 (max + 1)
Приведение типов ключей
<?php
declare(strict_types=1);
// Keys are cast to int or string
$arr = [
1 => 'int 1',
'1' => 'string 1', // Same key! Overwrites previous
1.9 => 'float 1.9', // Cast to int(1), overwrites again
true => 'bool true', // Cast to int(1), overwrites again
false => 'bool false', // Cast to int(0)
null => 'null value', // Cast to string ''
'' => 'empty string', // Same key as null!
];
var_dump($arr);
// [1 => 'bool true', 0 => 'bool false', '' => 'empty string']
Ловушка экзамена: Ключи массива приводятся к
int(если строка является валидным целым числом) илиstring.true=1,false=0,null='',1.9=1. Строка'01'НЕ приводится к числу (ведущий ноль), а строка'1'— приводится кint(1).
<?php
declare(strict_types=1);
// String keys that look like integers are cast to int
$arr = ['0' => 'a', '1' => 'b', '2' => 'c'];
var_dump(array_keys($arr)); // [0, 1, 2] — int keys!
// But strings with leading zeros stay as strings
$arr = ['01' => 'a', '02' => 'b'];
var_dump(array_keys($arr)); // ['01', '02'] — string keys!
// Negative numeric strings are also cast to int (PHP 8.1+)
$arr = ['-1' => 'neg'];
var_dump(array_keys($arr)); // [-1] — int in PHP 8.1+
Доступ к элементам
<?php
declare(strict_types=1);
$user = ['name' => 'Alice', 'age' => 25, 'hobbies' => ['php', 'js']];
// Direct access
echo $user['name']; // Alice
echo $user['hobbies'][0]; // php
// Null coalescing for safe access
echo $user['email'] ?? 'N/A'; // N/A (key doesn't exist)
// Checking existence
var_dump(isset($user['name'])); // true
var_dump(isset($user['email'])); // false
var_dump(array_key_exists('name', $user)); // true
// isset vs array_key_exists
$arr = ['key' => null];
var_dump(isset($arr['key'])); // false (null returns false!)
var_dump(array_key_exists('key', $arr)); // true (key exists)
Ловушка экзамена:
isset($arr['key'])возвращаетfalseесли значение равноnull, даже если ключ существует! Для проверки существования ключа используйтеarray_key_exists().
Добавление и удаление элементов
<?php
declare(strict_types=1);
$arr = ['a', 'b', 'c'];
// Append
$arr[] = 'd'; // Add to end
$arr[10] = 'k'; // Add at specific key
// Prepend
array_unshift($arr, 'z'); // Add to beginning (reindexes!)
// Remove
unset($arr[0]); // Remove element (does NOT reindex!)
// Remove and reindex
$arr = array_values($arr); // Reset keys to sequential
// Remove from end
$last = array_pop($arr); // Returns and removes last element
// Remove from beginning
$first = array_shift($arr); // Returns and removes first (reindexes!)
// Array splice
$arr = ['a', 'b', 'c', 'd', 'e'];
$removed = array_splice($arr, 1, 2, ['x', 'y']);
// $arr = ['a', 'x', 'y', 'd', 'e']
// $removed = ['b', 'c']
Запомни:
unset()удаляет элемент, но НЕ переиндексирует массив.array_shift()удаляет первый элемент И переиндексирует. Для переиндексации послеunsetиспользуйтеarray_values().
Многомерные массивы
<?php
declare(strict_types=1);
// 2D array
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
echo $matrix[1][2]; // 6
// Associative nested array
$users = [
'alice' => [
'email' => '[email protected]',
'roles' => ['admin', 'editor'],
],
'bob' => [
'email' => '[email protected]',
'roles' => ['user'],
],
];
echo $users['alice']['email']; // [email protected]
echo $users['alice']['roles'][0]; // admin
// Modifying nested values
$users['alice']['roles'][] = 'moderator';
// Destructuring (PHP 7.1+)
['email' => $email, 'roles' => $roles] = $users['alice'];
echo $email; // [email protected]
// Nested destructuring
[['name' => $name1], ['name' => $name2]] = [
['name' => 'Alice', 'age' => 25],
['name' => 'Bob', 'age' => 30],
];
Сравнение массивов
<?php
declare(strict_types=1);
$a = [1, 2, 3];
$b = [1, 2, 3];
$c = ['0' => 1, '1' => 2, '2' => 3];
$d = [3, 2, 1];
// == (loose): same key/value pairs (with type juggling)
var_dump($a == $b); // true
var_dump($a == $c); // true (string keys '0','1','2' = int 0,1,2)
var_dump($a == $d); // false (different order)
// === (strict): same key/value pairs, same types, same order
var_dump($a === $b); // true
var_dump($a === $c); // false! (keys are different types)
// Comparison with different order
$x = ['a' => 1, 'b' => 2];
$y = ['b' => 2, 'a' => 1];
var_dump($x == $y); // true (order doesn't matter for ==)
var_dump($x === $y); // false (order matters for ===)
Ловушка экзамена: Для ассоциативных массивов
==не учитывает порядок элементов, но===учитывает!['a'=>1, 'b'=>2] == ['b'=>2, 'a'=>1]=true, но===будетfalse.
Полезные операции
<?php
declare(strict_types=1);
$arr = [3, 1, 4, 1, 5, 9, 2, 6, 5];
// Count
echo count($arr); // 9
echo sizeof($arr); // 9 (alias)
// Check if array
var_dump(is_array($arr)); // true
// Check if empty
var_dump(empty([])); // true
var_dump(empty($arr)); // false
// in_array — search value
var_dump(in_array(4, $arr)); // true
var_dump(in_array('4', $arr)); // true (loose!)
var_dump(in_array('4', $arr, true)); // false (strict)
// array_search — find key by value
echo array_search(4, $arr); // 2 (key)
echo array_search(99, $arr); // false
// Spread operator
$first = [1, 2, 3];
$second = [4, 5, 6];
$merged = [...$first, ...$second]; // [1,2,3,4,5,6]