WordPressのテーマファイルを弄っていると、配列を扱うことがよくある。

まして、俺のようにデータの処理的なことまでテーマ内でやってると、配列はあちこちから引っ張りだこだ。

お前はいったいテーマ内で何をやってるんだ、というツッコミも受けつつ。

何かやりたいことがあったら、プラグインを探す前に、調べながら自作するのが性分なもんで。

今回は、PHPにおいて配列と配列を様々な方法で「結合」する方法をまとめてみた。

単純にくっつける

結合、だなんてタイトルに書いたけど、それこそ配列同士のくっつけ方なんていろいろある。

その中で最も単純な方法、つまり元の配列に対して別の配列の要素を追加する方法は以下の通り。

※以下、 $a$b はいずれも配列とする。

$array = $a + $b;
$array = array_merge($a, $b);

1行目はプラス演算子を使ったもの、2行目は関数 array_merge() を使ったものだ。

どちらも $a の末尾に $b を追加するが、少し違いがある。

$a$b が同じキーをもつ要素を含む場合、プラス演算子だと先の配列の要素が維持され、 array_merge() だと後の配列の要素が維持される。

すなわちキーが重複した要素は追加されず、いずれかの配列の要素に統合されるわけだ。

ただし、キーが整数である添字配列の場合は、キーに重複があっても統合されず、先の配列の末尾に要素が追加される(追加分のキーは新たに振られる)。

一方をキー、他方を値として結合する

同じ数の要素をもち、要素の並びも揃っている二つの配列をまとめ、 foreach 文なんかで同時に利用するときに便利な方法。

※元の配列はキーまでも揃っている必要はない。また、いずれのキーも最終的に無視される。

array_combine() を使えば、二つの配列をキーと値のペアとして結合できる。

$a = array('a', 'b', 'c');
$b = array(1, 2, 3);
$array = array_combine($a, $b);
// 上は下と同じ
$array = array('a' => 1, 'b' => 2, 'c' => 3);

$a の要素の値が新たな配列のキーとなり、 $b の要素の値が新たな配列の値となる。

ここで foreach を以下のように使用すると、ループ内で二つの配列の値のペアが $key, $value として同時に利用できる。

foreach ( $array as $key => $value ) {
    // $key   : 元 $a の要素
    // $value : 元 $b の要素
}

値のペアを組み合わせた2次元配列を作る

言葉で端的に説明するのが難しいのだが、以下のような $a$b を2次元的に組み合わせて $array のようにしたい。

$a = array('a', 'b', 'c');
$b = array(1, 2, 3);
$array = array(array('a', 1) , array('b', 2), array('c', 3));

このような配列を作るための関数は存在しないのだが、ここで array_map() の興味深い使用法を紹介しよう。

array_map() といえば配列のすべての要素に、指定した関数を適用するのに使うのだが、

$array = array_map('trim', $a);

array_map() で $a の各要素に trim() を適用する例

適用する関数にさらなる引数を与えるために、複数の配列を指定することもできる。

そしてさらに関数名の代わりに null を指定すると、何もせずに返すと思いきや、なんとすべての配列を二次元的にくっつけてくれるのだ。

$array = array_map(null, $a, $b);

こちらも $a$b の要素の数は揃えなければならない。

また、上記の「キーと値として結合する」のように foreach ループの中で要素のペアを同時に利用できる。

foreach ( $array as $value ) {
    // $value[0] : 元 $a の要素
    // $value[1] : 元 $b の要素
}

ペアの配列が二つなら array_combine() でもいいが、三つ以上を結合したい場合は array_map() の裏ワザが便利だ。

まとめ

今回は配列を結合する3種類の方法を紹介した。

配列のくっつけ方にもいろいろあるんだな。

これらを駆使して、より快適な配列ライフを!