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
)
)
每个分类都有相同的默认配置数组。
个人经验分享
-
和array_fill()的区别
| 函数 | 键名来源 | 适用场景 |
|---|---|---|
| array_fill() | 自动生成连续数字 | 索引数组、固定长度的列表 |
| array_fill_keys() | 手动指定键名数组 | 关联数组、字段默认值 |
-
典型使用场景
-
表单默认值:
$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);
-
-
性能提示
array_fill_keys()在处理大量键名时效率不错。假设有1万个键名要初始化,用这个函数比用foreach循环快不少。 -
注意引用
如果$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开始可用