PHP開発では、 array_flip()は、配列のキーと値を交換できる非常に一般的な関数です。この関数の構文は非常に単純ですが、使用すると、注目に値する制限があります。それ以外の場合は、array_flip()はエラーを報告するか、違法値を自動的に無視します。
それで、なぜこの制限があるのですか?その背後にある理由と制限をいくつかの側面から分析します。
$original = [
'apple' => 'red',
'banana' => 'yellow'
];
$flipped = array_flip($original);
print_r($flipped);
出力:
Array
(
[red] => apple
[yellow] => banana
)
ここでは、 array_flip()が文字列タイプであるため、 「赤」と「黄色」がキーに正常に変換されます。
PHPアレイは実際に順序付けられたマップであり、そのキーは整数または文字列のみになります。これはいくつかの弱いタイプの言語とは異なり、類似していますが、JavaScriptのオブジェクトキーメカニズムとはまったく同じではありません。
array_flip()を実行すると、PHPは元の配列の「値」を新しい配列の「キー」として扱おうとします。元の配列の値が次の場合:
弦?はい
整数?はい
ブール、浮動小数点数、配列、オブジェクト、ヌル?キーとして許可されていません
例えば:
$invalid = [
'one' => true,
'two' => [],
'three' => new stdClass(),
'four' => null,
];
$flipped = array_flip($invalid);
// 1つを投げます warning:array_flip(): Can only flip STRING and INTEGER values!
特定のタイプを、ブール値などの文字列や整数にキャストできる場合でも( Trueは1になります)、これは簡単に競合を引き起こす可能性があります。例えば:
$array = [
'a' => true,
'b' => 1,
'c' => '1'
];
$flipped = array_flip($array);
print_r($flipped);
出力:
Array
(
[1] => c
)
もともとは3つの異なる値がありましたが、それらはすべて同じキー1に「反転」し、最初の2つが上書きされ、最終的にはアイテム「C」=> 1のみが保持されました。
これが、 array_flip()では、値がキーとして安全なタイプである必要がある必要がある理由です。そうでなければ、データの損失または上書きが発生する可能性があります。
カントリーコードからカントリー名のマッピングがあり、国名を介してカントリーコードをすばやく見つけたいとします。
$countryCodes = [
'US' => 'United States',
'FR' => 'France',
'JP' => 'Japan'
];
$flipped = array_flip($countryCodes);
// クイック検索:
$code = $flipped['Japan']; // 結果は次のとおりです 'JP'
このシナリオでは、 array_flip()を使用することは非常に効率的であり、値は文字列であるため、タイプの問題はありません。
値にキーとして使用できない配列、オブジェクト、またはその他のタイプが含まれている場合、次の方法を使用できます。
$original = [
'a' => 'cat',
'b' => ['nested'],
'c' => 'dog'
];
$filtered = array_filter($original, function($value) {
return is_int($value) || is_string($value);
});
$flipped = array_flip($filtered);
print_r($flipped);
または、Try-Catchを使用してロジックをラップします(PHPは例外をスローしませんが、カスタムロジックで制御できます)エラーを回避します。
array_flip()の設計制限は、PHPアレイ自体の特性を反映しています。キーは整数または文字列のみです。この制限は、キーの予測可能性、パフォーマンスを確保し、予期しない値の上書きを回避することです。 array_flip()を使用する場合、操作が安全で信頼性が高いことを確認するために、配列内の値が適切なタイプであるかどうかを確認することをお勧めします。
システム内のURLからのキー値のペア変換を処理する必要がある場合は、次のように行うことができます。
$input = [
'home' => 'https://m66.net/index',
'about' => 'https://m66.net/about'
];
$flipped = array_flip($input);
print_r($flipped);
出力: