PHP массивы: полный обзор

Раздел: Основы 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 массив функции

Если массив содержит ассоциативные ключи, в строку попадут только значения. Ключи игнорируются.

Массив в PHP (тип данных) - comments

En
Php var array (php)