毎日のPHP開発では、「列挙値?タグ」間の相互変換に遭遇することがよくあります。たとえば、注文ステータスの配列:
$statusMap = [
0 => '支払われる',
1 => '有料',
2 => '出荷された',
3 => '完了しました',
];
この構造は、ステータスコードから対応するテキストの説明の抽出を容易にします。ただし、「出荷」に基づいて対応するステータスコード2を取り出すなど、他の方法を操作する必要がある場合もあります。この時点で、追加の構造的サポートがない場合は、配列全体を通過して同様のロジックを記述する必要がある場合があります。
function getStatusCode($label) {
foreach ($statusMap as $code => $desc) {
if ($desc === $label) {
return $code;
}
}
return null;
}
少し長く見えます。現時点では、PHPに付属するarray_flip()関数が便利です!
array_flip()は、配列の「キー」と値のペアリングに使用されるPHPの組み込み関数です。
array_flip(array $array): array
注:
配列の値は、キー(文字列や整数など)として使用できる一意でスカラー値でなければなりません。
重複した値がある場合、以下は前の値を上書きします。
列挙値の配列を優雅に逆転させる方法を見てみましょう。
$statusMap = [
0 => '支払われる',
1 => '有料',
2 => '出荷された',
3 => '完了しました',
];
$labelToCodeMap = array_flip($statusMap);
echo $labelToCodeMap['出荷された']; // 出力 2
すぐに簡単ですか? array_flip()は、「ラベル」から「値」にマッピングテーブルを取得するために1回だけです。
ユーザーの性別オプションの列挙があるとします。
$genderMap = [
'M' => '男',
'F' => '女性',
'O' => '他の',
];
フォームを送信するとき、ユーザーは「女性」を選択します。これを「F」に戻し、データベースに保存します。
$input = '女性';
$labelToValue = array_flip($genderMap);
$genderCode = $labelToValue[$input] ?? null;
if ($genderCode === null) {
echo "違法な性別価値";
} else {
// データベースに保存されているとします
saveGenderToDB($genderCode);
}
コードがよりコンパクトであるだけでなく、ロジックも非常に明確で理解しやすいです。
複数の場所で反転したアレイを使用する必要がある場合は、プロジェクトの一般的な方法を定義することもできます。
function getFlippedMap(array $map): array {
static $cache = [];
$hash = md5(json_encode($map));
if (!isset($cache[$hash])) {
$cache[$hash] = array_flip($map);
}
return $cache[$hash];
}
このようにして、たとえそれを複数回呼び出しても、既存の反転結果を再利用してパフォーマンスを改善することができます。
元の配列の値が一意ではない場合、 array_flip()が前のキーを自動的に上書きすることに注意してください。
$arr = [
'a' => 'apple',
'b' => 'banana',
'c' => 'apple',
];
print_r(array_flip($arr));
出力は次のとおりです。
Array
(
[banana] => b
[apple] => c // 'a' カバーされています
)
これにより、列挙値を扱うときにバグが発生する可能性があるため、値が反転前に一意であることを確認することをお勧めします。
array_flip()は、「ラベル?値」間の高速変換に特に適している、小さいながらも非常に実用的な機能です。それを通して、PHPコードをより簡潔に、読みやすく、エラーを減らすことができます。次回ループを書くときは、それについて考えることもできます。Array_flip ()を使用して1つのステップで取得できますか?