「いまいち配列のメリットが分からない」
ということを思っていませんか?
今回は、配列を作るときに便利な関数、compactの使い方とテクニックについて解説します。
ぜひ、参考にしてください。
目次
compactの仕様
compactのリファレンスを確認してみます。
変数名とその値から配列を作成します。
各引数について、compact() は現在のシンボルテーブルにおいてその名前を有する変数を探し、 変数名がキー、変数の値がそのキーに関する値となるように追加します。 端的に言うと、extract() の逆の動作をします。
関数の引数は、以下のようになっています。
1 |
compact ( array|string $var_name , array|string ...$var_names ) : array |
引数はいくつでも渡すことができ、その型は配列(array型)でも文字列(string型)でもOKです。
また、この関数が返す値は配列(array型)になっています。
次に、具体的なcompactの使い方をプログラムと合わせて解説していきます。
例えばこんな配列を考えてみます。
1 2 3 4 5 |
$user = [ 'name' => 'hoge', 'email' => 'hoge@hoge.com', 'address' => 'hoge city', ]; |
ここでcompactを使って書き換えると、このようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$name = 'hoge'; $email = 'hoge@hoge.com'; $address = 'hoge city'; $user = compact('name', 'email', 'address'); print_r($user); // 出力結果↓ Array ( [name] => hoge [email] => hoge@hoge.com [address] => hoge city ) |
ここでのポイントは、
compactを使うときのポイントは、変数名から$マークを削除した文字列を引数として指定することです。
先の例とプログラムで言うと、$name→’name’という対応になります。
もし、変数名と対応しない文字列を指定すると、配列の要素にはなりません。
1 2 3 4 5 6 7 8 9 10 11 12 |
$name = 'hoge'; $email = 'hoge@hoge.com'; $address = 'hoge city'; $user = compact(1, 'email', 3); print_r($user); // 出力結果 ( [email] => hoge@hoge.com ) |
このように変数名とキーが対応せずに、emailのキーのみが対応するようになっています。
compactが便利なシーン
と思う人もいるかもしません。
なので、compactの便利なシーンを解説する前に、ここで配列を使うことのメリットを抑えおきましょう。
配列を使うと、理解しやすいプログラムになる
実際の開発では、配列を使わないということはまずありません。
なぜなら、配列を使うと理解しやすいプログラムになるからです。
先ほど紹介したプログラムをもう一度、引用します。
1 2 3 4 5 6 |
$name = 'hoge'; $email = 'hoge@hoge.com'; $address = 'hoge city'; $user = compact('name', 'email', 'address'); print_r($user); |
このプログラムの配列について仕様をまとめると、このようになります。
$user[‘name’]と$nameという変数名だと、$user[‘name’]の方が「ユーザの名前」という意味を推測しやすいです。
一方で、「$name」では「なにの名前を表現しているのか」を考えなければなりません。
1 2 3 4 5 6 |
// ユーザのnameを取得する場合 // $nameだとなにの名前(name)なのかわからない echo $name // $user['name']だと、「ユーザの名前」と推測しやすい echo $user['name']; |
そのプログラムが書かれるのは一度ですが、他の人から何度も読まれます。
他の人がプログラムを読むことを考えると、配列を使った方がいいです。
compactでタイプミスを減らす
compactを使うとタイプミスを減らすことができます。
例えばこのようなプログラムだと配列のキーとして、name、email、 addressという配列のキーを毎回、書くことになります。
1 2 3 4 5 |
$user = [ 'name' => 'hoge', 'email' => 'hoge@hoge.com', 'address' => 'hoge city', ]; |
一方で、compactを使って書くと変数名と配列のキーは同じものです。(これについてはcompactの使い方で解説しました。)
1 2 3 4 5 6 |
$name = 'hoge'; $email = 'hoge@hoge.com'; $address = 'hoge city'; $user = compact('name', 'email', 'address'); print_r($user); |
もしタイプミスすると、値を取得できないのでデバッグするときにも簡単に気づくことができます。
compactと逆の処理をするextract
compactに関連して、その逆の処理をするextractもここであわせて抑えておきましょう。
extractは、compactの逆の処理する関数です。
extractのリファレンスには、このようにあります。
配列からシンボルテーブルに変数をインポートします。
各キーについて変数名として有効であるかどうか、 そして、シンボルテーブルの既存の変数と衝突しないかどうかを確認します。
$name→’name’のような「変数名」→「配列のキー」にして配列を作るのがcompactでした。
これに対して、‘name’→$nameとして「配列のキー」→「変数名」にして、変数を作るのがextractです。
extractは、’name’→$nameの対応で変数を作る
具体的にプログラムで解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$user = [ 'name' => 'hoge', 'email' => 'hoge@hoge.com', 'address' => 'hoge city', ]; print_r($user); extract($user, EXTR_OVERWRITE); echo "$name, $email $address \n"; // 出力結果↓ ( [name] => hoge [email] => hoge@hoge.com [address] => hoge city ) hoge, hoge@hoge.com hoge city |
extractの仕様として、引数に配列と、展開する配列をどのように展開するかのflag, prefixを渡すようになっています。
返り値として、展開できた配列の要素の数を返します。
詳しくはリファレンスを確認です。
実際にcompactが使われているプログラム
compactが実際にどんなプログラムがで使われているのか、解説します。
Laravelでは、compactが必須
Laravel では、コントローラーからビューに値を渡すときにcompactが便利です。
Laravelのドキュメントにあるプログラムを参考に解説します。
1 2 3 |
Route::get('/', function () { return view('greeting', ['name' => 'James']); }); |
このプログラムでは、nameを配列のキーをとして、Jamesという要素を格納しています。
これをcompactを使って書き換えるとこのようになります。
1 2 3 4 |
Route::get('/', function () { $name = 'James'; return view('greeting', compact('name')); }); |
Laravelでは、よく出てくる書き方ですので抑えておきたいところです。
まとめ
いかがでしたか?
今回は、「PHPで知っておきたい!compactの使い方とテクニック」についてご紹介しました。
これでcompactを使って、また一つ効率よくプログラムを書けるはずです。
ぜひ参考にしてみてくださいね。