array_flipでキーと値を入れ替える発想

array_flip とは、配列のキーと値を入れ替える関数です。値からキーを逆引きしたり、isset での存在チェックを高速化したりするのに使えます。

キーと値をひっくり返す

array_flip は名前のとおり、配列のキーと値を入れ替えるだけの関数です。単純ですが、この「入れ替え」という発想が思いのほか便利で、慣れると設計の引き出しが一つ増える気がします。

$colors = ['r' => 'red', 'g' => 'green', 'b' => 'blue'];

$flipped = array_flip($colors);
// ['red' => 'r', 'green' => 'g', 'blue' => 'b']

値だったものがキーになるので、値からキーを逆引きしたいときにそのまま使えます。マスタの表引きを両方向でやりたい場面で重宝します。

存在チェックを速くする常套手段

私が一番よく使うのはこの用途です。in_array は要素数に比例して遅くなりますが、array_flip でキー化してから isset で見れば、ハッシュ参照なので実質一定時間で済みます。許可リストのような、何度も存在チェックする配列に効きます。

$allowed = ['apple', 'banana', 'cherry'];

// 都度 in_array は要素が増えるとつらい
if (in_array('banana', $allowed, true)) { /* ... */ }

// キー化して isset で引く
$lookup = array_flip($allowed);
if (isset($lookup['banana'])) {
    // こちらは高速
}

ループの中で何万回も判定するようなら、ループの外で一度 flip しておくのが定石ですね。逆に数回しか見ないなら普通に in_array で十分だと思います。

重複と型の落とし穴

気をつけたいのは、元の配列に重複する値があると、キーは一意なので後勝ちで潰れる点です。件数が減ることがあるので、逆引き目的なら値が一意かどうかを意識しておきたいところです。また、キーにできるのは整数と文字列だけなので、値に配列や null が混じっていると警告が出てスキップされます。

$dup = ['a' => 1, 'b' => 1, 'c' => 2];

var_dump(array_flip($dup));
// [1 => 'b', 2 => 'c'] a は b に上書きされた

まとめ

array_flip は「値でひける形に組み替える」ための小さな道具で、存在チェックの高速化という実利がはっきりしています。重複値が後勝ちで消えること、キーにできない型があること、この2点だけ気をつければ、逆引きや許可リスト判定で安心して使えると思います。

よくある質問

Q. in_array より速いというのは本当ですか?
A. 何度も存在チェックするならそうです。flip でキー化してから isset で見ればハッシュ参照になり、実質一定時間で済みます。数回だけなら in_array で十分です。

Q. 値が重複しているとどうなりますか?
A. キーは一意なので後勝ちで潰れ、件数が減ることがあります。逆引き目的なら、値が一意かどうかを意識しておきたいところです。

Q. どんな値でも入れ替えられますか?
A. キーにできるのは整数と文字列だけです。値に配列や null が混じると、警告が出てその要素はスキップされます。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です