在PHP 中, array_fill()是一個非常實用的函數,用於創建一個帶有默認值的數組。然而,它的一個限制是,不支持使用字符串鍵(即關聯數組)。那麼,如果我們希望使用類似array_fill()的方式來初始化一個帶有指定鍵名的關聯數組,該怎麼做呢?
本文將介紹如何封裝一個自定義函數,使其支持關聯鍵值的批量初始化。
先來看看標準的array_fill()是怎麼工作的:
$filled = array_fill(0, 3, 'default');
print_r($filled);
輸出結果為:
Array
(
[0] => default
[1] => default
[2] => default
)
你可以看到它只支持數字鍵,從起始索引填充指定數量的元素。
假設我們有一組預定義的鍵名,如下:
$keys = ['username', 'email', 'age'];
我們希望通過一個函數,一次性將它們初始化為統一的默認值,例如'N/A' ,並生成如下結構:
[
'username' => 'N/A',
'email' => 'N/A',
'age' => 'N/A'
]
雖然PHP 內置了一個array_fill_keys()函數可以實現這個目標,但為了教學目的,我們自己來封裝一個更具擴展性的版本:
/**
* 使用指定的鍵數組和值,初始化一個關聯數組
*
* @param array $keys 要使用的鍵名數組
* @param mixed $value 每個鍵的默認值
* @return array 初始化後的關聯數組
*/
function array_fill_keys_custom(array $keys, $value): array {
$result = [];
foreach ($keys as $key) {
$result[$key] = $value;
}
return $result;
}
$fields = ['username', 'email', 'age'];
$defaultValue = 'N/A';
$initializedArray = array_fill_keys_custom($fields, $defaultValue);
print_r($initializedArray);
輸出結果:
Array
(
[username] => N/A
[email] => N/A
[age] => N/A
)
我們也可以擴展這個函數,讓它支持根據鍵名動態生成不同的值,比如使用一個回調函數:
function array_fill_keys_callback(array $keys, callable $callback): array {
$result = [];
foreach ($keys as $key) {
$result[$key] = $callback($key);
}
return $result;
}
$keys = ['token', 'session_id', 'timestamp'];
$data = array_fill_keys_callback($keys, function($key) {
switch ($key) {
case 'token':
return bin2hex(random_bytes(8));
case 'session_id':
return uniqid('sess_', true);
case 'timestamp':
return date('Y-m-d H:i:s');
default:
return null;
}
});
print_r($data);
輸出示例(每次運行可能不同):
Array
(
[token] => 9f3a8f734b23f9cd
[session_id] => sess_6623fa3890adf3.20534250
[timestamp] => 2025-04-20 13:52:43
)
這種封裝非常適合用於表單字段初始化、API 返回模板生成、或者默認配置數組構造。例如你在構造REST API 的默認返回時:
$responseTemplate = array_fill_keys_custom(['code', 'message', 'data'], null);
$responseTemplate['code'] = 200;
$responseTemplate['message'] = '操作成功';
$responseTemplate['data'] = ['url' => 'https://m66.net/api/example'];
print_r($responseTemplate);
雖然PHP 提供了一些現成的數組函數(如array_fill_keys() ),但通過自定義封裝,我們可以實現更靈活的初始化方式,尤其是在處理關聯數組時更加得心應手。
這種方式不僅代碼更優雅,還能提高你對數組操作邏輯的掌控力。在實際項目中,尤其是需要動態生成大量結構化數據時,它將是一個非常有用的小工具。