【フォーム】確認画面の表示に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にはorange
とapple
が入っていた。なのでそれに一致している$fruit(第一引数)の値だけが抜き出されて配列が作られる。この時、キーと値の関係は維持されるため、もとの連想配列のかたちのまま持ってくることが出来る。
これでキーだけを抜き出せば確認画面の表示用に使え、値を文字列に変換したりすればデータベースに格納できる。なによりforeachを回さずに1行で書けるため非常にスマート。
使える場所はそこそこ限定されるけど、個人的に役に立った。というかみんなはどうしてるんだろう。
もっといい書き方ありましたらお教え下さい(ヽ’ω`)