PHP массивы: полный обзор
Массивы в PHP: базовые принципы и практика
Массив в PHP - это структура данных, которая хранит набор элементов, каждый из которых имеет ключ (индекс) и значение. Массивы могут быть индексированными (с числовыми ключами), ассоциативными (со строковыми ключами) и многомерными. Понимание работы с массивами необходимо для любого PHP-разработчика, поскольку они используются повсеместно: от обработки форм до хранения результатов запросов к базе данных.
Основной способ создания и заполнения массива
Самый прямой путь - использовать синтаксис array() или квадратные скобки []. Рекомендуется современный вариант с квадратными скобками, так как он короче и быстрее выполняется.
<?php
// Индексированный массив
$colors = ['red', 'green', 'blue'];
// Ассоциативный массив
$user = [
'name' => 'Иван',
'age' => 25,
'city' => 'Москва'
];
// Многомерный массив
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
?>
После создания массива можно обращаться к элементам по ключу:
echo $colors[0]; // red
echo $user['name'];// Иван
echo $matrix[1][2];// 6
Типичная ошибка: обращение к несуществующему ключу вызывает предупреждение Undefined array key. Рекомендуется проверять наличие ключа через isset() или array_key_exists().
Как создать массив из строки через разделитель?
Функция explode() разбивает строку на части и возвращает индексированный массив. Это удобно для обработки CSV-данных, тегов или списков.
<?php
$csv = 'apple,banana,orange';
$fruits = explode(',', $csv);
// ['apple','banana','orange']
?>
Важно: если разделитель не найден, explode() вернёт массив с одним элементом – исходной строкой. Проверяйте наличие разделителя, особенно при обработке пользовательского ввода.
Как создать массив с диапазоном чисел или букв?
Функция range() генерирует последовательность значений. Полезна для заполнения массива номерами дней, буквами алфавита или любыми упорядоченными данными.
<?php
$numbers = range(1, 5); // [1,2,3,4,5]
$letters = range('a', 'e'); // ['a','b','c','d','e']
$odd = range(1, 10, 2); // [1,3,5,7,9] (шаг 2)
?>
Ошибка: третий параметр (шаг) может быть только целым числом. Если передано число с плавающей точкой, оно будет округлено. Для нецелых шагов используйте цикл.
Как заполнить массив значениями с помощью цикла?
Циклы for или while позволяют динамически наполнять массив. Пример: создание массива квадратов чисел от 1 до 10.
<?php
$squares = [];
for ($i = 1; $i <= 10; $i++) {
$squares[] = $i * $i;
}
// Результат: [1,4,9,16,25,36,49,64,81,100]
?>
Если не указать ключ (пустые скобки []), PHP автоматически назначает следующий числовой индекс. При использовании ассоциативного массива нужно явно задавать ключ, иначе он получит числовой индекс.
Как добавить один или несколько элементов в начало или конец массива?
Для добавления в конец используется array_push() или синтаксис $arr[] = value. Для добавления в начало – array_unshift().
<?php
$stack = [2, 3];
array_push($stack, 4); // [2,3,4]
$stack[] = 5; // [2,3,4,5]
array_unshift($stack, 1); // [1,2,3,4,5]
?>
Внимание: array_push() возвращает новое количество элементов, а не изменённый массив. Если нужно только добавить один элемент, удобнее синтаксис []. При вставке в начало все числовые ключи переиндексируются, что может повлиять на ассоциативные ключи – они остаются неизменными, но порядок меняется.
Как проверить, существует ли элемент в массиве?
Для проверки наличия ключа используйте array_key_exists() или isset(). Для проверки значения – in_array() или array_search().
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
var_dump(array_key_exists('b', $arr)); // true
var_dump(isset($arr['b'])); // true (но если значение null, isset вернёт false)
var_dump(in_array(2, $arr)); // true
var_dump(array_search(2, $arr)); // 'b' (ключ первого найденного)
?>
Различие между isset() и array_key_exists(): isset() возвращает false для ключа, значение которого равно null. array_key_exists() не учитывает значение. Выбирайте в зависимости от логики.
Как перебрать все элементы массива?
Основные методы: foreach, for (только для индексированных), array_walk или array_map.
<?php
$fruits = ['apple', 'banana', 'orange'];
// foreach – универсален
foreach ($fruits as $index => $fruit) {
echo "$index: $fruit\n";
}
// for – только для непрерывных числовых ключей
for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i] . "\n";
}
// array_walk – с callback-функцией
array_walk($fruits, function($value, $key) {
echo "$key: $value\n";
});
?>
При использовании for с count() в условии цикла функция вызывается на каждой итерации. Для большого массива лучше вычислить длину до цикла: $len = count($arr); for($i=0;$i<$len;$i++).
Как отсортировать массив?
PHP предлагает несколько функций: sort() (по значениям, переиндексация), asort() (по значениям, сохранение ключей), ksort() (по ключам), usort() (пользовательская сортировка).
<?php
$ages = ['Иван' => 30, 'Петр' => 25, 'Анна' => 28];
sort($ages); // переиндексирует ключи: [25,28,30]
asort($ages); // ключи сохраняются: ['Петр'=>25,'Анна'=>28,'Иван'=>30]
ksort($ages); // сортировка по имени: ['Анна'=>28,'Иван'=>30,'Петр'=>25]
?>
Важно: sort() и подобные функции изменяют исходный массив (передают по ссылке) и возвращают true/false. Нельзя присвоить результат переменной. Для сортировки ассоциативного массива по значению с сохранением ключей используйте asort().
Как объединить, вычесть или пересечь массивы?
Функции: array_merge() (объединение), array_diff() (разность), array_intersect() (пересечение). Важно понимать поведение при совпадении ключей.
<?php
$a = [1, 2, 3];
$b = [3, 4, 5];
$merged = array_merge($a, $b); // [1,2,3,3,4,5]
$diff = array_diff($a, $b); // [0=>1,1=>2]
$inter = array_intersect($a, $b); // [2=>3]
// С ассоциативными массивами: при совпадении строковых ключей array_merge перезаписывает значение
$c = ['x' => 10, 'y' => 20];
$d = ['y' => 30, 'z' => 40];
$mergedAssoc = array_merge($c, $d); // ['x'=>10, 'y'=>30, 'z'=>40]
?>
При использовании array_merge() с числовыми ключами они переиндексируются. Если нужно сохранить ключи, используйте оператор + (но он не перезаписывает существующие ключи).
Как удалить элемент из массива?
Для удаления по ключу: unset($arr[$key]). Для удаления по значению: array_search() + unset(). Для удаления первого/последнего элемента: array_shift() / array_pop().
<?php
$arr = ['a', 'b', 'c', 'b'];
unset($arr[1]); // удаляет 'b' (ключ 1) -> ['a', 2=>'c', 3=>'b'] (ключи не переиндексируются)
array_shift($arr); // удаляет первый элемент ('a') и переиндексирует: [0=>'c',1=>'b']
array_pop($arr); // удаляет последний ('b') -> [0=>'c']
// удаление по значению (первого вхождения)
if (($key = array_search('c', $arr)) !== false) {
unset($arr[$key]);
}
?>
После unset() числовые ключи не пересчитываются. Если нужен непрерывный индекс, примените array_values($arr). При использовании array_search() обязательно строгое сравнение (!== false), так как первый ключ может быть равен 0.
Расширенные примеры работы с массивами
Использование array_filter() с callback для фильтрации данных
Функция array_filter() оставляет только те элементы, для которых callback возвращает true. Пример: отбор чётных чисел.
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
print_r($even);
?>
Array
(
[1] => 2
[3] => 4
[5] => 6
)
Обратите внимание: ключи сохраняются. Для сброса индексов используйте array_values().
array_reduce() для свёртки массива в одно значение
Позволяет вычислить сумму, произведение или любой агрегат на основе элементов массива.
<?php
$prices = [100, 250, 180, 90];
$total = array_reduce($prices, function($carry, $item) {
return $carry + $item;
}, 0);
echo "Сумма: $total";
?>
Сумма: 620
Первым параметром callback получает аккумулятор, вторым – текущее значение. Начальное значение 0 задаётся третьим аргументом.
Работа с многомерными массивами и рекурсивная обработка
Пример рекурсивной функции для подсчёта суммы всех элементов в многомерном массиве произвольной вложенности.
<?php
$nested = [
1,
[2, 3, [4, 5]],
6,
[7, [8, 9]]
];
function recursiveSum($arr) {
$sum = 0;
foreach ($arr as $value) {
if (is_array($value)) {
$sum += recursiveSum($value);
} else {
$sum += $value;
}
}
return $sum;
}
echo recursiveSum($nested); // 45
?>
45
Использование is_array() необходимо, чтобы отличать скалярные значения от вложенных массивов.
Создание ассоциативного массива из двух массивов через array_combine()
Функция создаёт массив, где первый массив – ключи, второй – значения. Длины должны совпадать.
<?php
$keys = ['name', 'age', 'city'];
$values = ['Анна', 28, 'Казань'];
$person = array_combine($keys, $values);
print_r($person);
?>
Array
(
[name] => Анна
[age] => 28
[city] => Казань
)
Если количество элементов в массивах разное, возникнет ошибка Warning: array_combine(). Перед вызовом проверяйте длины через count().
Использование array_slice() для извлечения части массива
Позволяет взять подмассив по смещению и длине. Полезно при постраничном выводе данных.
<?php
$items = ['a', 'b', 'c', 'd', 'e', 'f'];
$page1 = array_slice($items, 0, 3); // ['a','b','c']
$page2 = array_slice($items, 3, 3); // ['d','e','f']
// С сохранением ключей: по умолчанию переиндексирует, можно указать true
$assoc = ['x' => 1, 'y' => 2, 'z' => 3];
$slice = array_slice($assoc, 1, 2, true); // ['y'=>2,'z'=>3]
?>
array_chunk() для разбиения массива на группы
Разбивает массив на фрагменты заданного размера. Удобно для группировки данных.
<?php
$cards = range(1, 10);
$groups = array_chunk($cards, 3);
print_r($groups);
?>
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[2] => Array
(
[0] => 7
[1] => 8
[2] => 9
)
[3] => Array
(
[0] => 10
)
)
Третий параметр $preserve_keys (по умолчанию false) определяет, сохранять ли исходные ключи.
Применение array_unique() для удаления дубликатов
Удаляет повторяющиеся значения, сохраняя первое вхождение.
<?php
$duplicates = [1, 2, 2, 3, 1, 4, 5, 3];
$unique = array_unique($duplicates);
print_r($unique);
?>
Array
(
[0] => 1
[1] => 2
[3] => 3
[5] => 4
[6] => 5
)
Ключи остаются прежними. Для реиндексации примените array_values().
Преобразование массива в строку через implode()
Обратная операция explode() – склеивание элементов с разделителем.
<?php
$words = ['PHP', 'массив', 'функции'];
$sentence = implode(' ', $words); // 'PHP массив функции'
echo $sentence;
?>
PHP массив функции
Если массив содержит ассоциативные ключи, в строку попадут только значения. Ключи игнорируются.