当前位置: 首页> 最新文章列表> 编写一个支持默认值回调的 array_fill_advanced() 函数

编写一个支持默认值回调的 array_fill_advanced() 函数

M66 2025-06-05

在 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;
}

使用示例

示例 1:使用固定值填充

$data = array_fill_advanced(1, 3, 'hello');
// 结果: [1 => 'hello', 2 => 'hello', 3 => 'hello']

示例 2:动态生成随机字符串

$data = array_fill_advanced(0, 5, function($index) {
    return bin2hex(random_bytes(4));
});
// 结果: [0 => '9f3a4b2c', 1 => 'fa92be77', ...]

示例 3:使用字符串作为键前缀

$data = array_fill_advanced('item_', 3, function($key) {
    return strtoupper($key);
});
// 结果: ['item_0' => 'ITEM_0', 'item_1' => 'ITEM_1', ...]

示例 4:填充对象或数据结构

$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() 可以成为你工具箱中非常实用的小工具。