PHPでは、 array_fill_keys()は非常に実用的な機能であり、指定されたキーを使用して新しい配列をすばやく作成し、すべてのキーの値を同じ値に設定できます。質問は、匿名関数(クロージャー)**をarray_fill_keys()関数の塗りつぶし値として使用できますか?
答えは次のとおりですが、注意すべきことが1つあります。
array_fill_keys(array $keys, mixed $value): array
$キーは、設定するキー名を含む配列です。
$値は、各キーに割り当てたい値です。
匿名関数を$ 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
)
ご覧のとおり、各キーに対応する値は、匿名関数の実行結果ではなく、閉鎖オブジェクトです。つまり、各キーを匿名関数によって異なる値を生成する必要がある場合、直接それを行うことはできません。
キーごとに異なる値を生成する場合(異なる乱数など)、トラバーサルで匿名関数を実行する必要があります。
<?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アレイの動作をより深く理解しようとすることもできます。