在 PHP 中,原生的 array_fill() 函数可以用于将数组的指定键范围填充为固定值,语法简单,效率也很高:
$filled = array_fill(0, 5, 'default');
// 结果: ['default', 'default', 'default', 'default', 'default']
然而,有时我们希望填充的值不是固定的,而是通过某种逻辑动态生成的。例如,填充为递增的数值、UUID、随机数、或是根据当前键生成的自定义结构。
为了实现更灵活的需求,我们可以设计一个增强版本的 array_fill() 函数:array_fill_advanced()。这个函数允许你传入一个「默认值回调函数」,根据键名动态生成对应的值。
支持填充任意长度的数组
起始索引可自定义(可以是整数,也可以是字符串)
值可以是固定的,也可以是通过回调函数生成的
回调函数接受当前键索引作为参数
以下是 array_fill_advanced() 的实现方式:
/**
* 动态填充数组
*
* @param int|string $startIndex 开始的键名
* @param int $count 填充个数
* @param mixed $valueOrCallback 固定值或回调函数
* @return array
*/
function array_fill_advanced($startIndex, int $count, $valueOrCallback): array {
$result = [];
// 判断起始索引是否为整数
$isNumericIndex = is_int($startIndex);
for ($i = 0; $i < $count; $i++) {
$key = $isNumericIndex ? $startIndex + $i : $startIndex . $i;
if (is_callable($valueOrCallback)) {
$result[$key] = call_user_func($valueOrCallback, $key);
} else {
$result[$key] = $valueOrCallback;
}
}
return $result;
}
$data = array_fill_advanced(1, 3, 'hello');
// 结果: [1 => 'hello', 2 => 'hello', 3 => 'hello']
$data = array_fill_advanced(0, 5, function($index) {
return bin2hex(random_bytes(4));
});
// 结果: [0 => '9f3a4b2c', 1 => 'fa92be77', ...]
$data = array_fill_advanced('item_', 3, function($key) {
return strtoupper($key);
});
// 结果: ['item_0' => 'ITEM_0', 'item_1' => 'ITEM_1', ...]
$data = array_fill_advanced(0, 3, function($index) {
return [
'id' => $index,
'url' => "https://m66.net/resource/{$index}"
];
});
/*
结果:
[
0 => ['id' => 0, 'url' => 'https://m66.net/resource/0'],
1 => ['id' => 1, 'url' => 'https://m66.net/resource/1'],
...
]
*/
array_fill_advanced() 为 PHP 开发者提供了一种更通用、更强大、更灵活的数组填充方式。通过引入回调函数,我们不仅可以减少重复代码,还能实现基于键值逻辑的动态内容构建。
这在处理批量初始化数据、构造测试样本、生成模拟 API 数据等场景中非常有用。结合匿名函数与灵活的键名策略,array_fill_advanced() 可以成为你工具箱中非常实用的小工具。