當前位置: 首頁> 最新文章列表> 編寫一個支持默認值回調的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()可以成為你工具箱中非常實用的小工具。