開発では、特にキャッシュ、構成の初期化、またはデータの正規化が実行されるシナリオで、キー名のセットに統一されたデフォルト値を設定する必要があることがよくあります。 PHPの組み込みArray_fill_keys()関数は、この問題を非常にエレガントに解決し、冗長コードを削減し、コードの読みやすさと実行効率を向上させるのに役立ちます。
この記事では、キャッシュ構造のデフォルト値を例として使用して、 array_fill_keys()を使用してこの目標を達成する方法を説明します。
array_fill_keys()は、指定された値を配列内の指定されたキーを入力するためにPHPによって提供される配列関数です。
関数定義:
array array_fill_keys(array $keys, mixed $value)
$キー:すべてのキー名を含む配列。
$値:各キーに割り当てるデフォルト値。
例:
$keys = ['user_1', 'user_2', 'user_3'];
$defaultValue = null;
$cache = array_fill_keys($keys, $defaultValue);
print_r($cache);
出力:
Array
(
[user_1] =>
[user_2] =>
[user_3] =>
)
典型的なシナリオを想像してみてください。ユーザーIDに従ってキャッシュデータを事前定義された配列にバッチする必要があるシステムキャッシュ構造を構築しています。
$defaultCacheValue = [
'profile' => null,
'settings' => [],
'last_login' => null,
];
複数のユーザーIDがあります:
$userIds = [101, 102, 103, 104];
これらの構造を手動で初期化すると、長く維持するのが難しくなります。 array_fill_keys()を使用して簡単に行う:
$keys = array_map(function ($id) {
return "user_cache_$id";
}, $userIds);
$cacheStructure = array_fill_keys($keys, $defaultCacheValue);
print_r($cacheStructure);
出力結果:
Array
(
[user_cache_101] => Array
(
[profile] =>
[settings] => Array
(
)
[last_login] =>
)
[user_cache_102] => Array
(
[profile] =>
[settings] => Array
(
)
[last_login] =>
)
...
)
ユーザーIDがデータベースまたはAPIから取得された場合は、 array_column()を使用して動的に処理することもできます。
// から想定します API 次の構造を返します
$userData = [
['id' => 201, 'name' => 'Alice'],
['id' => 202, 'name' => 'Bob'],
['id' => 203, 'name' => 'Charlie'],
];
$userIds = array_column($userData, 'id');
$keys = array_map(function ($id) {
return "user_cache_$id";
}, $userIds);
$defaultCache = [
'profile_url' => 'https://m66.net/user/default',
'status' => 'offline',
'messages' => [],
];
$cache = array_fill_keys($keys, $defaultCache);
print_r($cache);
不変の構造の注:パディングのデフォルト値を変更すると、アレイは同じ構造を指すため、すべてのキーに影響します。各キーを独立した構造にしたい場合は、手動でコピーする必要があります。
$cache = [];
foreach ($keys as $key) {
$cache[$key] = $defaultCache; // もし defaultCache それはオブジェクトです,ディープコピーが必要です
}
array_mapで使用する方が強力です: array_map 、 array_column 、 array_combineおよびその他の関数を組み合わせて、非常に簡潔で柔軟なデータ処理ロジックを記述できます。
array_fill_keys()は、PHPで非常に実用的な機能であり、特に初期化フェーズ中のバッチ充填構造に適しています。キャッシュの初期化、データの正規化、または構成プリセットを実行しているかどうかにかかわらず、この関数を適切に使用すると、コードがよりきれいでエレガントになります。