Способы формирования массивов в языке 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() преобразует его в обычный массив.