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