1. ホーム
  2. PHP

【PHP】array_combine と array_flip の使い方|配列のキーと値を対応付ける・入れ替える

Share

2つの配列を「キーの一覧」と「値の一覧」として1つの連想配列にまとめたい、あるいは配列のキーと値を入れ替えたい——そんなときに使えるのが array_combine()array_flip() です。どちらも配列のキーと値の関係を組み替える関数で、CSV のヘッダーと行データを結びつけたり、値から添字を逆引きしたりといった処理を短く書けます。この記事では2つの関数の基本的な使い方と、使うときの注意点を具体的なコードで解説します。

2つの関数の役割

名前が似ていますが、2つの関数がやることははっきり違います。array_combine() は「別々の2つの配列」を、片方をキー・もう片方を値として1つの連想配列に組み立てます。array_flip() は「1つの配列」のキーと値の役割を入れ替えます。まずは違いを整理しておきましょう。

関数役割
array_combine($keys, $values)2つの配列を、キーの配列・値の配列として1つの連想配列にまとめる
array_flip($array)1つの配列のキーと値を入れ替える

array_combine でキーと値を組み合わせる

array_combine() は、第1引数の配列をキー、第2引数の配列を値として、新しい連想配列を作ります。CSV のヘッダー行とデータ行を結びつけるような場面で便利です。

combine.php
<?php
$keys   = ['name', 'age', 'city'];
$values = ['田中', 28, '東京'];

$person = array_combine($keys, $values);

print_r($person);
// Array
// (
//     [name] => 田中
//     [age]  => 28
//     [city] => 東京
// )

第1引数の nameagecity がキーになり、第2引数の値がそれぞれ対応する位置で結びつきます。先頭から順番にペアになっていくため、2つの配列の並び順がそのまま対応関係になる点を意識しておきましょう。

要素数が違うとエラーになる

array_combine() は、キーの配列と値の配列の要素数が一致している必要があります。数が違うと、PHP 8.0 以降では ValueError という例外が発生します(それ以前のバージョンでは警告が出て false が返ります)。事前に count() で両方の要素数をそろえておくと安全です。

combine-check.php
<?php
$keys   = ['name', 'age'];
$values = ['田中', 28, '東京']; // 数が多い

if (count($keys) === count($values)) {
    $person = array_combine($keys, $values);
} else {
    // 数が違うときの処理(ここでは空配列にしておく)
    $person = [];
}

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

array_flip() は、配列のキーと値をそっくり入れ替えます。値だったものがキーになり、キーだったものが値になります。「値から添字を調べたい」というときに役立ちます。

flip.php
<?php
$colors = ['赤', '緑', '青'];

$flipped = array_flip($colors);

print_r($flipped);
// Array
// (
//     [赤] => 0
//     [緑] => 1
//     [青] => 2
// )

// 「緑」が何番目かを調べられる
echo $flipped['緑']; // 1

元の配列では添字 0・1・2 に色名が入っていましたが、入れ替え後は色名がキーになり、もとの添字が値になりました。これにより $flipped['緑'] のように、値からその位置を逆引きできます。

特定の値が含まれるか高速に調べる

array_flip() でキー化しておくと、isset() で値の存在チェックができます。in_array() は配列全体を順番に探しますが、キーの存在確認は内部的に高速なため、同じ配列に対して何度も「含まれるか」を調べる場合に有効です。

flip-lookup.php
<?php
$allowed = ['apple', 'banana', 'orange'];

// 値をキーにしておく
$lookup = array_flip($allowed);

// isset で存在チェック(in_array の代わり)
if (isset($lookup['banana'])) {
    echo 'banana は許可されています';
}

array_flip で値が重複しているとき

array_flip() で注意したいのは、元の配列に同じ値が複数あるケースです。入れ替えると値はキーになりますが、キーは重複できません。そのため同じ値が複数あると、あとから出てきたものが先のものを上書きし、最後の組み合わせだけが残ります。

flip-duplicate.php
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 1]; // 値 1 が重複

$flipped = array_flip($data);

print_r($flipped);
// Array
// (
//     [1] => c   // a ではなく、後勝ちで c が残る
//     [2] => b
// )

このように、値が重複している配列を反転させると要素が減ることがあります。逆引きが目的のときは、元の配列の値がすべて異なる(一意である)ことを確認してから使うと安心です。なお array_flip() に渡せる値は整数か文字列だけで、配列やオブジェクトを値に持つ要素があると警告が出てその要素は無視されます。

まとめ

array_combine()array_flip() は、どちらも配列のキーと値の関係を組み替える関数です。要点を振り返ります。

  • array_combine($keys, $values) は2つの配列をキーと値として1つの連想配列にまとめる
  • array_combine() はキーと値の要素数が一致していないとエラーになる
  • array_flip($array) は1つの配列のキーと値を入れ替える
  • 値から位置を逆引きしたいときや、isset() での高速な存在チェックに使える
  • 値が重複していると、反転後は後勝ちで上書きされ要素が減る

「2つの配列を組み合わせるなら array_combine()」「1つの配列のキーと値を入れ替えるなら array_flip()」と役割で覚えておくと、必要な場面でさっと使い分けられます。

参考ページ