Возможности PHP: функция array_fill_keys
Изучите PHP array_fill_keys(): создание ассоциативного array из списка ключей и общего значения, с примерами дубликатов и числовых ключей.
array_fill_keys() — встроенная функция PHP, которая создаёт новый ассоциативный array из списка ключей и единственного значения, присваиваемого каждому элементу. Это самый быстрый способ предварительно заполнить array, когда ключи уже известны, но все они должны начинаться с одного значения по умолчанию — например, для обнуления набора счётчиков, пометки списка элементов как false или создания слотов-заглушек, которые будут заполнены позже.
На этой странице описывается, что делает array_fill_keys(), её точное поведение с дублирующимися и числовыми ключами, чем она отличается от array_fill() и array_combine(), и когда её следует использовать.
Синтаксис
array_fill_keys(array $keys, mixed $value): array| Параметр | Описание |
|---|---|
$keys | Array значений, которые будут использоваться в качестве ключей нового array. Каждый элемент используется как ключ, а не как значение. |
$value | Значение, присваиваемое каждому ключу. Может быть любого типа — скаляр, null, array или object. |
Возвращаемое значение: новый array, ключи которого берутся из $keys, а значения — все равны $value. Доступна начиная с PHP 5.2.0.
Ключи подчиняются стандартным правилам PHP для ключей array: допустимы только целые числа и string. Строка, похожая на десятичное целое число (например,
"5"), приводится к целому5, а ключиtrue/false/nullстановятся1/0/"".
Базовый пример
Передайте ключи первым аргументом, а общее значение для заполнения — вторым:
Результатом является ассоциативный array с вашими ключами, каждый из которых сопоставлен с одним и тем же значением:
Array
(
[a] => value
[b] => value
[c] => value
)Это удобно, когда у вас есть набор ключей, но значения либо пока не важны, либо все должны начинаться одинаково — распространённый случай: инициализация счётчиков значением 0:
<?php
$letters = array("a", "b", "c");
$counts = array_fill_keys($letters, 0);
$counts["a"]++;
$counts["a"]++;
$counts["c"]++;
print_r($counts);
?>Array
(
[a] => 2
[b] => 0
[c] => 1
)Использование null, array или object в качестве значения
Значение для заполнения может быть любого типа. Используйте null для создания слотов-заглушек, которые вы заполните позже:
<?php
$keys = array("id", "status");
$filled = array_fill_keys($keys, null);
print_r($filled);
?>Array
(
[id] =>
[status] =>
)Если значение является array или object, оно копируется по значению в каждый ключ, поэтому изменение одного элемента никогда не влияет на остальные:
<?php
$buckets = array_fill_keys(array("a", "b"), array());
$buckets["a"][] = 1;
print_r($buckets);
?>Array
(
[a] => Array
(
[0] => 1
)
[b] => Array
(
)
)Дублирующиеся и числовые ключи
Поскольку результат является настоящим PHP array, ключи подчиняются стандартным правилам. Дублирующиеся ключи сворачиваются в один элемент, а ключи в виде строк с десятичным числом преобразуются в целые:
<?php
print_r(array_fill_keys(array("5", 5, "name"), null));
?>Array
(
[5] =>
[name] =>
)Здесь "5" и 5 оба сохраняются как целочисленный ключ 5, поэтому в результате остаётся только одна запись с ключом 5. Учитывайте это, если список ключей может содержать дубликаты — array окажется короче входных данных.
array_fill_keys() и связанные функции
array_fill()заполняет диапазон последовательных целочисленных ключей, начиная с заданного смещения, а не из явного списка ключей. Используйте её, когда нужны индексы вида0, 1, 2, ….array_combine()объединяет array ключей с array значений равной длины, присваивая каждому ключу отдельное значение. Используйтеarray_fill_keys(), когда каждое значение одинаково.array_keys()выполняет обратную операцию: извлекает ключи из существующего array.
Распространённый шаблон — задать значения по умолчанию с помощью array_fill_keys(), а затем объединить с реальными данными:
<?php
$defaults = array_fill_keys(array("name", "email", "active"), null);
$input = array("name" => "Ann", "active" => true);
print_r(array_merge($defaults, $input));
?>Array
(
[name] => Ann
[email] =>
[active] => 1
)Это гарантирует наличие каждого ожидаемого ключа, даже если входные данные неполные.
Итоги
array_fill_keys() превращает список ключей и одно общее значение в готовый ассоциативный array. Применяйте её для инициализации счётчиков, флагов или записей-заглушек в одну строку. Помните, что значение для заполнения копируется в каждый ключ, а дублирующиеся или строковые десятичные ключи сворачиваются согласно стандартным правилам PHP для ключей array. Для разных значений по ключам используйте array_combine(); для последовательных целочисленных индексов — array_fill(). Смотрите руководство по array в PHP для общего понимания темы.