array_fill仅支持整数起始键,负数或浮点数会被静默截断为整数;字符串键会触发警告并返回空数组;关联键需用array_fill_keys;多维数组需用array_map避免引用共享。

array_fill 生成固定值数组时,键必须是整数
调用 array_fill 时传入的起始键(第一个参数)和数量(第二个参数)都会被强制转为整数。如果传了负数或浮点数,PHP 会静默截断:比如 array_fill(-2.9, 3, 'x') 实际从键 -2 开始,生成 [-2=>'x', -1=>'x', 0=>'x'];array_fill(1.7, 2.9, 'y') 等价于 array_fill(1, 2, 'y'),结果是 [1=>'y', 2=>'y']。
常见错误是误以为能用字符串键:array_fill('a', 3, 'v') 会报 Warning 并返回空数组 —— 因为起始键不是整数,函数直接失败。
要填关联键,别硬套 array_fill,改用 array_fill_keys
如果你手头有一个键名数组(比如 ['name', 'email', 'age']),想让它们都对应默认值 null,array_fill 完全不适用。这时候该用 array_fill_keys:
array_fill_keys(['name', 'email', 'age'], null) // → ['name' => null, 'email' => null, 'age' => null]
注意区别:
立即学习“PHP免费学习笔记(深入)”;
-
array_fill($start, $num, $value):只接受整数起始键,生成连续数字键 -
array_fill_keys($keys, $value):接受任意数组(键可为字符串),把每个键映射到同一值
array_fill 不支持多维初始化,嵌套得手动 or array_map
想生成一个 3×4 的二维数组,每项都是 0?array_fill(0, 3, array_fill(0, 4, 0)) 看似可行,但所有子数组其实是同一个引用 —— 改一个,全变:
$a = array_fill(0, 3, array_fill(0, 4, 0)); $a[0][0] = 99; var_dump($a[1][0]); // 输出 99,不是 0
正确做法是用 array_map 或循环逐个生成独立数组:
$a = array_map(fn() => array_fill(0, 4, 0), range(0, 2));
// 或
$a = [];
for ($i = 0; $i < 3; $i++) {
$a[] = array_fill(0, 4, 0);
}
性能上,array_fill 比循环快,但差别只在万级数据以上
生成 1000 个元素的数组,array_fill 和 for 循环耗时几乎一样(纳秒级差异)。只有当你要生成上万个元素(比如预分配缓存、批量测试数据)时,array_fill 的 C 层实现才显出优势。
不过要注意:它不校验内存是否足够。填 100 万个大对象(如 new DateTime())会立刻 OOM,而循环中你至少有机会加 if (memory_get_usage() > $limit) break; 控制。
实际写业务逻辑时,别为了“看起来更短”硬套 array_fill——键不是整数、要深拷贝、需条件判断,就老实用循环或更语义明确的函数。



















