← PHP中的extract():把数组元素变成独立变量 PHP中的array_filter():用回调函数过滤数组元素 →

PHP中的array_fill_keys():用指定的键名数组创建填充数组

原创 2026-05-22 PHP 已有人查阅

array_fill()是从指定索引开始连续填充,键名是自动生成的数字。

array_fill_keys()则不同——它可以指定一批键名,然后给这些键名都赋上相同的值。也就是说,键名由你定,值统一给一个。这个函数从PHP 5.2开始可用。

语法格式

array array_fill_keys(array $keys, mixed $value): array

参数说明:

参数 说明 必填?
keys 作为键名的数组 必填
value 给每个键赋的值 必填

返回值: 返回填充好的关联数组。

示例1:基础用法

<?php
$fields = ["username", "email", "phone", "address"];
$default_values = array_fill_keys($fields, "");
print_r($default_values);
?>

输出:

Array
(
    [username] => 
    [email] => 
    [phone] => 
    [address] => 
)

非常实用的场景:创建一个表单字段的初始数据数组,所有字段默认空字符串。

示例2:混合类型的键名

<?php
$keys = [101, 102, "admin", "guest", 205];
$role_permissions = array_fill_keys($keys, "read_only");
print_r($role_permissions);
?>

输出:

Array
(
    [101] => read_only
    [102] => read_only
    [admin] => read_only
    [guest] => read_only
    [205] => read_only
)

键名可以是整数也可以是字符串,最终数组会混合类型。

示例3:键名重复时的行为

<?php
$keys_with_duplicates = ["a", "b", "a", "c", "b"];
$result = array_fill_keys($keys_with_duplicates, "重复的值");
print_r($result);
?>

输出:

Array
(
    [a] => 重复的值
    [b] => 重复的值
    [c] => 重复的值
)

重复的键名只会保留之后一个?等等,仔细看:a和b都重复了,但结果里每个键只出现一次。实际上array_fill_keys()内部会先取$keys数组的值,重复的键名自然会互相覆盖。结果和array_combine($keys, array_fill(0, count($keys), $value))的效果类似。

示例4:填充数组作为值

<?php
$categories = ["电子产品", "服装", "食品", "图书"];
$default_config = [
    "status" => "active",
    "priority" => 1,
    "created_at" => date("Y-m-d")
];

$category_config = array_fill_keys($categories, $default_config);
print_r($category_config);
?>

输出:

Array
(
    [电子产品] => Array
        (
            [status] => active
            [priority] => 1
            [created_at] => 2026-01-15
        )
    [服装] => Array
        (
            [status] => active
            [priority] => 1
            [created_at] => 2026-01-15
        )
    [食品] => Array
        (
            [status] => active
            [priority] => 1
            [created_at] => 2026-01-15
        )
    [图书] => Array
        (
            [status] => active
            [priority] => 1
            [created_at] => 2026-01-15
        )
)

每个分类都有相同的默认配置数组。

个人经验分享

  1. 和array_fill()的区别

函数 键名来源 适用场景
array_fill() 自动生成连续数字 索引数组、固定长度的列表
array_fill_keys() 手动指定键名数组 关联数组、字段默认值
  1. 典型使用场景

    • 表单默认值$defaults = array_fill_keys(['name','email','msg'], '');

    • 权限初始化$perms = array_fill_keys($user_roles, false);

    • 批量设置默认配置$config = array_fill_keys($feature_flags, 'disabled');

    • 缓存预热$cache = array_fill_keys($cache_keys, null);

  2. 性能提示
    array_fill_keys()在处理大量键名时效率不错。假设有1万个键名要初始化,用这个函数比用foreach循环快不少。

  3. 注意引用
    如果$value是数组或对象,所有元素会共享同一个引用:

    $keys = ['a', 'b', 'c'];
    $shared = ['count' => 0];
    $result = array_fill_keys($keys, $shared);
    $result['a']['count'] = 100;
    print_r($result['b']);  // ['count'] => 100,也被改了

    如果需要独立副本,可以用循环或在填充前clone(对象)或array_merge(数组)。

示例5:代码号学习编程场景

<?php
// 场景:学期初始成绩初始化
$student_ids = ["code001", "code002", "code003", "code004", "code005"];
$subjects = ["PHP", "MySQL", "JavaScript", "Laravel"];

// 初始化所有学生各科成绩为空
$initial_score = null;
$all_scores = array_fill_keys($student_ids, array_fill_keys($subjects, $initial_score));

// 录入部分成绩
$all_scores["code001"]["PHP"] = 85;
$all_scores["code001"]["MySQL"] = 92;
$all_scores["code002"]["PHP"] = 78;
$all_scores["code003"]["Laravel"] = 88;

echo "代码号001的成绩:\n";
print_r($all_scores["code001"]);
?>

输出:

代码号001的成绩:
Array
(
    [PHP] => 85
    [MySQL] => 92
    [JavaScript] => 
    [Laravel] => 
)

示例6:使用动态生成的键名数组

<?php
// 生成本月每一天的日期作为键名
$days_in_month = range(1, date('t'));  // 当月天数 1~28/29/30/31
$date_keys = array_map(function($day) {
    return date('Y-m-') . str_pad($day, 2, '0', STR_PAD_LEFT);
}, $days_in_month);

// 初始化每日访问量统计
$daily_visits = array_fill_keys($date_keys, 0);
$daily_visits['2026-01-15'] = 1280;
$daily_visits['2026-01-16'] = 1432;

echo "1月15日访问量:{$daily_visits['2026-01-15']}\n";
echo "1月16日访问量:{$daily_visits['2026-01-16']}\n";
?>

示例7:空键名数组

<?php
$empty_keys = [];
$result = array_fill_keys($empty_keys, "任何值");
var_dump($result);
?>

输出:

array(0) {
}

键名数组为空时,返回空数组,不会报错。

示例8:键名包含不可转换的类型

<?php
// 注意:键名必须是整数或字符串类型
// 如果传数组或对象作为键名,会报错
$bad_keys = [[1,2], new stdClass()];
// $result = array_fill_keys($bad_keys, "test");  // 这行会报错
echo "非法的键名类型会导致错误\n";
?>

本节课程知识要点

  • array_fill_keys()用指定的键名数组创建关联数组,所有值相同

  • 两个参数:键名数组 + 填充值

  • 键名只能是整数或字符串(数组的键名规范)

  • 键名重复时,后面的覆盖前面的(但函数内部取唯一值)

  • 填充值为数组/对象时,所有元素共享同一个引用

  • 比手动foreach循环创建快得多

  • 从PHP 5.2开始可用

← PHP中的extract():把数组元素变成独立变量 PHP中的array_filter():用回调函数过滤数组元素 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号