在PHP中, array_fill_keys()是一個非常實用的函數,它允許我們快速地使用指定的鍵創建一個新數組,並將所有鍵的值統一設為同一個值。那麼問題來了:我們能否在array_fill_keys()函數中使用**匿名函數(Closure)**作為填充值呢?
答案是:可以,但是有一點需要注意。
array_fill_keys(array $keys, mixed $value): array
$keys是一個數組,包含你想設置的鍵名。
$value是你想要賦給每個鍵的值。
雖然你可以將匿名函數作為$value傳入array_fill_keys() ,但是它的行為可能不會如你期望的那樣—— 它不會為每個鍵執行這個匿名函數,而是將同一個函數引用賦給所有鍵。
<?php
$keys = ['apple', 'banana', 'cherry'];
$array = array_fill_keys($keys, function() {
return rand(1, 100);
});
print_r($array);
輸出結果:
Array
(
[apple] => Closure Object
[banana] => Closure Object
[cherry] => Closure Object
)
可以看到,每個鍵對應的值是一個Closure對象,而不是匿名函數的執行結果。這意味著,如果你希望每個鍵都有一個不同的、由匿名函數生成的值,那麼你不能直接這樣做。
如果你想為每個鍵生成一個不同的值(比如不同的隨機數),你應該在遍歷中執行匿名函數:
<?php
$keys = ['apple', 'banana', 'cherry'];
$array = [];
foreach ($keys as $key) {
$array[$key] = (function() {
return rand(1, 100);
})();
}
print_r($array);
示例輸出:
Array
(
[apple] => 73
[banana] => 25
[cherry] => 89
)
你也可以使用array_map()搭配鍵名數組來實現:
<?php
$keys = ['apple', 'banana', 'cherry'];
$array = array_combine($keys, array_map(function() {
return rand(1, 100);
}, $keys));
print_r($array);
假設你正在開發一個小應用,每個模塊都需要一個默認處理器,你可以這樣寫:
<?php
$modules = ['news', 'shop', 'forum'];
$defaultHandler = function($module) {
return "https://m66.net/handler/{$module}";
};
$config = [];
foreach ($modules as $module) {
$config[$module] = $defaultHandler($module);
}
print_r($config);
輸出示例:
Array
(
[news] => https://m66.net/handler/news
[shop] => https://m66.net/handler/shop
[forum] => https://m66.net/handler/forum
)
array_fill_keys()支持傳入匿名函數作為值,但不會執行它。
若你希望生成動態值,應該在循環或array_map()中調用匿名函數。
array_fill_keys()更適合用於靜態值填充,而動態邏輯推薦用遍歷的方式處理。
希望這篇文章能幫你更好地理解PHP 中array_fill_keys()和匿名函數的用法差異!如果你對這類底層行為感興趣,不妨試著深入了解PHP 數組在內存中的行為,也許會有更多收穫。