Array fill: примеры (PHP)
array_fill(int $start_index, int $count, mixed $value): arrayФункция array_fill() создает и возвращает массив, заполненный одинаковыми значениями. Она используется, когда нужно инициализировать массив определенного размера одним значением, например, для создания заглушек, подготовки структуры данных или сброса значений.
array_fill(int $start_index, int $count, mixed $value): array
Функция принимает три аргумента:
- $start_index (int): Первый ключ возвращаемого массива. Если значение отрицательное, первым ключом будет оно, а последующие увеличатся.
- $count (int): Количество элементов для вставки. Должно быть больше или равно нулю. Если равно нулю, функция вернет пустой массив.
- $value (mixed): Значение для заполнения массива. Может быть любого типа.
$array = array_fill(0, 5, 'test');
print_r($array);Array
(
[0] => test
[1] => test
[2] => test
[3] => test
[4] => test
)$array = array_fill(-3, 4, 'value');
print_r($array);Array
(
[-3] => value
[-2] => value
[-1] => value
[0] => value
)$numArray = array_fill(5, 3, 42);
$boolArray = array_fill(0, 2, true);
$nullArray = array_fill(1, 2, null);
print_r($numArray);
print_r($boolArray);
print_r($nullArray);Array
(
[5] => 42
[6] => 42
[7] => 42
)
Array
(
[0] => 1
[1] => 1
)
Array
(
[1] =>
[2] =>
)$array = array_fill(10, 0, 'any');
var_dump($array);array(0) {
}- array_fill_keys() - Создает массив, заполняя его значениями, используя другой массив для определения ключей. Удобно, когда нужно задать одинаковое значение для набора известных ключей.
$keys = ['a', 'b', 'c']; $filled = array_fill_keys($keys, 'default'); print_r($filled);Array ( [a] => default [b] => default [c] => default ) - Циклы (for, foreach) и array_pad(). Циклы предлагают большую гибкость при сложной логике заполнения. Функция array_pad() дополняет существующий массив до нужной длины значением, а не создает новый с нуля.
- array_map() с анонимной функцией. Может имитировать заполнение, но менее эффективно для простых случаев.
array_fill() предпочтительнее при создании нового массива фиксированной длины с одним значением. array_fill_keys() используют, если ключи не являются последовательными числами.
$array = array_fill(0, -2, 'val');
var_dump($array);Warning: array_fill(): Argument #2 ($count) must be greater than or equal to 0
$array = array_fill('first', 3, 'val'); // Строка вместо int
var_dump($array);Warning: array_fill(): Argument #1 ($start_index) must be of type int
// Попытка создать очень большой массив может исчерпать память.
// $hugeArray = array_fill(0, 1000000000, 'data'); // Осторожно!Все элементы ссылаются на один и тот же объект, что может быть неожиданно.
class Item {}
$array = array_fill(0, 2, new Item());
$array[0]->prop = 'changed';
print_r($array[1]->prop); // Свойство изменилось и у второго элементаchanged
- В PHP 8.0 сигнатура функции была приведена к виду с явными типами аргументов (int $start_index, int $count, mixed $value). Передача аргументов несовместимого типа теперь вызывает TypeError, а не предупреждение.
- До PHP 8.0 некорректные типы аргументов приводились с генерацией предупреждений.
Можно комбинировать с array_map для создания массива массивов.
// Создание матрицы 3x3, заполненной нулями
$matrix = array_fill(0, 3, array_fill(0, 3, 0));
print_r($matrix);Array
(
[0] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[1] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[2] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
)// Инициализация счетчиков для диапазонов от 0 до 9
$counters = array_fill(0, 10, 0);
$data = [2, 5, 2, 8, 9, 5, 2];
foreach ($data as $value) {
if ($value >= 0 && $value < 10) {
$counters[$value]++;
}
}
print_r($counters);Array
(
[0] => 0
[1] => 0
[2] => 3
[3] => 0
[4] => 0
[5] => 2
[6] => 0
[7] => 0
[8] => 1
[9] => 1
)Чтобы избежать проблемы с одним объектом, используют array_map.
class Point {
public $x = 0;
public $y = 0;
}
// Создание массива из 3 различных объектов
$points = array_map(function() { return new Point(); }, array_fill(0, 3, null));
$points[0]->x = 10;
echo $points[1]->x; // 0, потому что это другой объект0
// Создание массива [10, 12, 14, 16, 18]
$start = 10;
$step = 2;
$count = 5;
$array = array_map(fn($i) => $start + $i * $step, array_fill(0, $count, 0));
// Альтернативно через array_keys
$array = array_map(fn($k) => $start + $k * $step, array_keys(array_fill(0, $count, null)));
print_r($array);Array
(
[0] => 10
[1] => 12
[2] => 14
[3] => 16
[4] => 18
)Array fill в Python
Используют оператор умножения для списков или метод repeat() из модуля itertools.
# Список
arr = ['value'] * 5
print(arr) # ['value', 'value', 'value', 'value', 'value']
# С помощью range и for (для избегания ссылок на один объект)
arr = ['value' for _ in range(5)]
print(arr)['value', 'value', 'value', 'value', 'value'] ['value', 'value', 'value', 'value', 'value']
Array fill в Javascript
Методы Array().fill() или комбинация Array() и map().
// Метод fill
let arr1 = new Array(5).fill('test');
console.log(arr1); // ['test', 'test', 'test', 'test', 'test']
// Array.from
let arr2 = Array.from({length: 5}, () => 'value');
console.log(arr2);['test', 'test', 'test', 'test', 'test'] ['value', 'value', 'value', 'value', 'value']
Array fill в MySQL
Прямого аналога нет, но можно генерировать последовательности через системные таблицы или рекурсивные CTE (в MySQL 8.0+).
-- Генерация пяти строк со значением 'constant'
WITH RECURSIVE seq AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM seq WHERE n < 5
)
SELECT 'constant' AS val FROM seq;val constant constant constant constant constant
Отличие PHP-функции в явном указании начального индекса, что дает контроль над ключами массива.