PHPにおいて関数を作るとき、
- 1つ以上の返り値を返したい、
- 呼出元でまとめて返り値を受けたい、
こういった 複数返り値のやり方 について。
方法は2つあるので、コード例付きで紹介します。
方法1.連想配列を関数から返すやり方
これはオーソドックで一般的なやり方です。
関数から配列(連想配列)を返す方法。
※ ちなみにPHPでは 配列 = 連想配列
具体的な例を出すと、次の通り
まず次みたいな関数があるとしましょう。
▼ 返り値を連想配列で返す関数
1 2 3 4 5 6 7 |
function sum_and_avg($nums){ $sum = array_sum($nums); return [ 'sum' => $sum, 'avg' => $sum / count($nums) ]; } |
連想配列から返り値をまとめて返してるだけ。
この場合では配列の合計と平均を計算し、 'sum' => $sum から合計を、 'avg' => $sum / count($nums) から平均値を返すようにしてます。
あとは関数を呼び出して受け取るだけです。
▼ この関数の使い方・呼び出し例
1 2 3 4 5 6 7 |
$result = sum_and_avg([1, 2, 3]); $sum = $result['sum']; $avg = $result['avg']; echo '$sum : ' . $sum . ', '; /// => $sum : 6 echo '$avg : ' . $avg; /// => $avg : 2 |
ただ次の点がすこし不便かも
- 返り値用の変数が増えてしまう
- 少しだけコードが冗長になる
まあ気にするほどでもないですが・・・
この書き方が嫌いなら、別の方法もあります。
方法2.関数に返り値を参照渡しするやり方
PHPでは変数を参照渡しできます。
その参照渡しで複数返り値を返すやり方
※ 参照渡し = リファレンス とも呼ぶ
詳しくは以下説明の通りです。
PHP において、リファレンスとは同じ変数の内容を異なった名前で コールすることを意味します。これは C のポインタとは異なります。 リファレンスを使ってポインタの演算をすることはできませんし、 リファレンスは実メモリのアドレスでもありません。
引用元 : https://www.php.net/manual/ja/language.references.whatare.php
参照(リファレンス)の詳細は上ページをチェック。
ここでは説明せず、複数返り値に利用する方法だけ説明します。
まず複数返り値を返す function を定義
▼ たとえばこのような関数
1 2 3 4 |
function sum_and_avg($nums, &$sum, &$avg){ $sum = array_sum($nums); $avg = $sum / count($nums); } |
先と同じく合計&平均を返す関数
関数内では return を一切使ってません。
代わりに &$sum と &$avg を参照渡ししてます。
このように参照渡ししておくと、関数内で $sum , $avg に行った変更が関数外でも保たれることができます。だから複数を返り値してるのと実質的に同じです。
あとは普通に関数を呼び出せばOK
▼ 関数の呼び出し方コード例
1 2 3 4 5 |
sum_and_avg([1, 2, 3], $sum, $avg); echo '$sum : ' . $sum . ', '; /// => $sum : 6 echo '$avg : ' . $avg; /// => $avg : 2 |
上コードの $sum と $avg に返り値が入ります。
あとは関数内で計算して、この2つに結果が入る訳ですね。
この方法は1つめと比べると・・・
- 返り値用の変数を用意しなくて済む
- 1行でスマートに結果を受け取れる
- コードも冗長にならず少し短くできる
これだけのメリットもあります。
ただし、参照渡しだと以下の欠点もあるので注意。
- 引数の数が多くなってしまう
- コードが分かりにくくなる
- 可変の返り値には対応できない
返り値が1個とか2個とか、固定なら有用かもです。
それ以外は連想配列を返す方法をオススメします。
蛇足.JavaScriptでの複数返り値について
ちなみにJavaScriptでも同じことはできます。
詳しくは次記事に書かれているのでチェック
JSだと柔軟な受け渡しもできて便利ですね。
複数返り値のやり方まとめ
ここまでで紹介した方法は次の2つ
連想配列を返した方が汎用性が高いと思います。
以上、PHPでの複数返り値についてでした。ではまた($・・)/~~~