當前位置: 首頁> 最新文章列表> 寫一個函數封裝array_fill() 支持關聯鍵初始化

寫一個函數封裝array_fill() 支持關聯鍵初始化

M66 2025-06-05

在PHP 中, array_fill()是一個非常實用的函數,用於創建一個帶有默認值的數組。然而,它的一個限制是,不支持使用字符串鍵(即關聯數組)。那麼,如果我們希望使用類似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'
]

三、自定義封裝函數: array_fill_keys_custom()

雖然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() ),但通過自定義封裝,我們可以實現更靈活的初始化方式,尤其是在處理關聯數組時更加得心應手。

這種方式不僅代碼更優雅,還能提高你對數組操作邏輯的掌控力。在實際項目中,尤其是需要動態生成大量結構化數據時,它將是一個非常有用的小工具。