Способы формирования массивов в языке PHP

Раздел: Структуры данных -> Работа с массивами

Способы получения массива в PHP

Наиболее эффективный способ создания массива в PHP - использование короткого синтаксиса, доступного с версии 5.4. Он короче и выполняется быстрее, чем устаревшая конструкция array().


$arr = [1, 2, 3];
$assoc = ['name' => 'Иван', 'age' => 30];
  

Этот вариант подходит для любых случаев, когда требуется явно определить массив - будь то индексный, ассоциативный или смешанный. Проблемы могут возникнуть только при использовании очень старых версий PHP (ниже 5.4), но в современных проектах это неактуально.

Как создать массив с помощью функции array()?

Функция array() - классический способ, работающий во всех версиях PHP. Она принимает список элементов или пары ключ => значение.


$arr = array(1, 2, 3);
$assoc = array('name' => 'Петр', 'age' => 25);
  

Типичная ошибка:

Попытка использовать короткий синтаксис в PHP до 5.4 приведёт к синтаксической ошибке. Решение - использовать array() или обновить версию PHP.

Также путаница возникает при смешивании синтаксисов: $arr = array[1,2]; - неверно.

Цель - обратная совместимость или поддержка старых проектов. В современном коде предпочтительнее короткий синтаксис.

Как получить массив из строки с разделителями?

Функция explode() разбивает строку на массив подстрок по заданному разделителю.


$string = 'яблоко,груша,банан';
$fruits = explode(',', $string);
  

Проблема:

Если после запятой есть пробелы, они попадут в элементы. Решение - использовать trim() или preg_split() с регулярным выражением.


$fruits = array_map('trim', explode(',', $string));
    

Пустая строка на конце (например, при разделителе в конце) даст пустой элемент. Удалить его можно array_filter().

Используется для разбора CSV, URL-параметров, пользовательского ввода.

Как получить массив из диапазона чисел?

Функция range() создаёт массив, содержащий последовательность чисел (или символов).


$numbers = range(1, 10);      // [1,2,...,10]
$letters = range('a', 'e');   // ['a','b','c','d','e']
  

Третий необязательный аргумент задаёт шаг: range(0, 100, 10) - каждые 10.

Ошибка:

Передача некорректного шага (например, 0) вызывает предупреждение и возвращает false. Также при большом диапазоне возрастает расход памяти.

Применяется для генерации итераций, тестовых данных, календарей.

Как получить массив строк из файла?

Функция file() читает файл и возвращает массив строк (каждая строка - отдельный элемент, включая символ новой строки).


$lines = file('/path/to/file.txt');
  

Проблема:

Наличие символа \n в конце каждой строки. Для удаления используйте константу FILE_IGNORE_NEW_LINES.


$lines = file('/path/to/file.txt', FILE_IGNORE_NEW_LINES);
    

Если файл не существует, функция генерирует предупреждение и возвращает false. Рекомендуется проверять file_exists() или использовать @.

Используется для обработки логов, конфигураций, импорта данных.

Как получить массив результатов из базы данных?

При работе с MySQL через mysqli или PDO можно получить все строки запроса в виде массива.


// mysqli
$result = mysqli_query($conn, 'SELECT * FROM users');
$users = mysqli_fetch_all($result, MYSQLI_ASSOC);

// PDO
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  

Типичные ошибки:

Не указан режим выборки (по умолчанию - индексный массив). Для ассоциативного необходимо передать константу, иначе ключи будут числовые. Также при ошибке SQL запроса fetchAll() возвращает false, а mysqli_fetch_all() - false или пустой массив.

Цель - получение набора записей для вывода или дальнейшей обработки.

Как получить массив из глобальных переменных?

Суперглобальные массивы $_GET, $_POST, $_SERVER уже являются массивами. Также можно получить все определённые переменные через get_defined_vars().


$getParams = $_GET;           // массив параметров URL
$serverVars = $_SERVER;       // массив серверных данных
$allVars = get_defined_vars(); // массив всех переменных в текущей области видимости
  

Проблема:

Суперглобальные массивы всегда доступны, но их содержимое зависит от внешнего ввода, поэтому нужно фильтровать и проверять (filter_input()).

Используется для доступа к входным данным, отладки.

Как получить массив символов строки?

Функция str_split() разбивает строку на массив символов (или блоков заданной длины).


$chars = str_split('Привет');   // ['П','р','и','в','е','т']
$chunks = str_split('Длинный текст', 4); // ['Длин','ный ','текс','т']
  

Проблема:

Для многобайтовых кодировок (UTF-8) str_split() разбивает по байтам, что разрушает символы. Используйте mb_str_split() (PHP 7.4+) или preg_split('//u', ...).

Применяется при работе с посимвольной обработкой, шифрованием, проверкой длины.

Как получить массив, заполненный одинаковыми значениями?

Функция array_fill() создаёт массив, заполненный указанным значением, начиная с заданного индекса.


$filled = array_fill(0, 5, 'default'); // [0=>'default',1=>'default',...,4=>'default']
  

Ошибка:

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

Полезно для инициализации массивов-заполнителей, буферов.

Каждый из способов решает свою задачу: от простого объявления до извлечения данных из внешних источников. Выбор зависит от контекста и версии PHP.

Расширенные примеры получения массивов

1. explode: работа с лимитом и отрицательным значением

Пример

$str = 'a,b,c,d,e';
// ограничение на 3 элемента
$arr1 = explode(',', $str, 3);
print_r($arr1);
Array
(
    [0] => a
    [1] => b
    [2] => c,d,e
)
Пример

// отрицательный лимит - вернуть всё, кроме последних N
$arr2 = explode(',', $str, -2);
print_r($arr2);
Array
(
    [0] => a
    [1] => b
    [2] => c
)

Пояснение: третий параметр limit контролирует количество возвращаемых частей. Отрицательное значение исключает последние элементы.

2. range с нецелым шагом и регрессией

Пример

// шаг 0.5 (float)
$range = range(1, 3, 0.5);
print_r($range);
Array
(
    [0] => 1
    [1] => 1.5
    [2] => 2
    [3] => 2.5
    [4] => 3
)
Пример

// убывающий диапазон
$desc = range(10, 1, -2);
print_r($desc);
Array
(
    [0] => 10
    [1] => 8
    [2] => 6
    [3] => 4
    [4] => 2
)

Обратите внимание: для убывания шаг должен быть отрицательным.

3. file: чтение в массив с удалением пустых строк

Пример

$lines = file('data.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
print_r($lines);

В файле data.txt:

строка1

строка2
Array
(
    [0] => строка1
    [1] => строка2
)

Флаг FILE_SKIP_EMPTY_LINES пропускает пустые строки, FILE_IGNORE_NEW_LINES удаляет символы новой строки.

4. str_split для многобайтовых строк (mb_str_split)

Пример

$string = 'Привет мир';
// неправильно (байты)
$wrong = str_split($string);
echo count($wrong); // 20 для UTF-8 (каждый символ 2 байта)

// правильно
$correct = mb_str_split($string);
print_r($correct);
Array
(
    [0] => П
    [1] => р
    [2] => и
    [3] => в
    [4] => е
    [5] => т
    [6] =>  
    [7] => м
    [8] => и
    [9] => р
)

mb_str_split() доступна в PHP 7.4+. Для более старых версий используйте preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY).

5. array_fill с отрицательным индексом и проверкой количества

Пример

$arr = array_fill(-3, 4, 'x');
print_r($arr);
Array
(
    [-3] => x
    [-2] => x
    [-1] => x
    [0] => x
)
Пример

// недопустимое количество (0)
$empty = array_fill(0, 0, 'test');
var_dump($empty);
Warning: array_fill(): Number of elements must be positive
bool(false)

Всегда проверяйте, что количество элементов больше нуля, иначе результат false и предупреждение.

6. preg_split для сложных разделителей

Пример

$text = 'apple, banana; cherry|date';
// разделители: запятая, точка с запятой, вертикальная черта
$parts = preg_split('/[,;|]/', $text);
print_r($parts);
Array
(
    [0] => apple
    [1] =>  banana
    [2] =>  cherry
    [3] => date
)

Регулярное выражение позволяет гибко задавать разделители. Для удаления пробелов используйте array_map('trim', ...).

7. Получение массива из итератора (SplFixedArray)

Пример

$fixed = new SplFixedArray(3);
$fixed[0] = 'one';
$fixed[1] = 'two';
$fixed[2] = 'three';
$array = $fixed->toArray();
print_r($array);
Array
(
    [0] => one
    [1] => two
    [2] => three
)

SplFixedArray экономит память при фиксированном размере, а метод toArray() преобразует его в обычный массив.

- Php array access (доступ к элементам массива в php)
- Php длина массива (длина массива php)
- содержимое массива php (php вывод содержимого массива)
- Index php sort (сортировка в php)
- Php первый элемент (получение первого элемента в php)
- Php добавить (добавление в php)
- Php получить массив (получение массива в php)
- вывести элементы массива php (вывести массив в php)
- Php добавить массив в конец массива (добавление элемента в конец массива php)
- Array index php (индекс массива в php)
- Php удалить первый элемент массива (php удалить первый элемент массива)
- Php получить значения массива (получение значений массива в php)
- Php проверить массив (проверить, является ли переменная массивом в php)
- получить элемент массива php (получение элемента массива в php)
- Php array replace (array_replace - замена элементов массива в php)

Получение массива в PHP - comments

En
Php получить массив (php)