seseragiseven

【フォーム】確認画面の表示にarray_intersect()

フォームでの確認画面で、実際の値から表示用の項目を出す時に役立つメソッド。
array_intersect()を使って、「セレクトボックスで選ばれたものだけ連想配列に変換する」というもの。わかりづらいけど見たら分かってもらえる…と思う。頑張って書いた。

事例

例えば好きな果物を聞くようなセレクトボックスがあったとする。

<select name="fruit[]">
	<option value="orange">みかん</option>
	<option value="grape">ぶどう</option>
	<option value="apple">りんご</option>
</select>

この時当然ユーザーが見ている「みかん」と実際の値「orange」は別に設定されることが多い。これはデータベースの関係やらいろいろある。
この後phpファイルにデータを送信し、このままデータベースに入れる場合はいい。が、その間に確認画面を挟むとき、一気にめんどくさくなる(というか僕のとこではいつもなっている)のである(ヽ’ω`)

fruit[]のように角カッコがついたものの値は配列で送られる。1つめと3つめを選んだ場合はこういう具合。

array( 'orange' , 'apple' );

確認画面ではこれを保持しつつ、表示用に「みかん、りんご」と出さなければいけない。今まではこうやってた。

// 果物の対応配列
$fruits = array(
	'みかん' => 'orange',
	'ぶどう' => 'grape',
	'りんご' => 'apple',
);
$likes = $_POST['fruit'];
$result = array();

// 2重のforeachで回して、一致したら配列に入れてbreak
foreach( $like as $like ){
	foreach( $fruits as $key => $val ){
		if( (string)$like === (string)$val ){
			$result[] = $key;
			break;
		}
	}
} // $result = array( 'みかん' , 'りんご' );

これで欲しい表示用の値は取れるが、非効率で書くのも面倒く、スマートじゃない。どうするか。

array_intersect()

アレイ インターセクト。公式ドキュメントによると「array_intersect() は、他の全ての引数に存在する array1 の値を全て有する配列を返します。」とのこと。

つまりこういうことです

// 果物の対応配列
$fruits = array(
	'みかん' => 'orange',
	'ぶどう' => 'grape',
	'りんご' => 'apple',
);
$likes = $_POST['fruit'];
$result = array_intersect( $fruits , $likes );
// $result = array( 'みかん' => 'orange' , 'りんご' => 'apple' );

$likesにはorangeappleが入っていた。なのでそれに一致している$fruit(第一引数)の値だけが抜き出されて配列が作られる。この時、キーと値の関係は維持されるため、もとの連想配列のかたちのまま持ってくることが出来る。

これでキーだけを抜き出せば確認画面の表示用に使え、値を文字列に変換したりすればデータベースに格納できる。なによりforeachを回さずに1行で書けるため非常にスマート。

使える場所はそこそこ限定されるけど、個人的に役に立った。というかみんなはどうしてるんだろう。
もっといい書き方ありましたらお教え下さい(ヽ’ω`)

この記事をシェアする

コメントを残す

カテゴリー

人気の記事