PHPの関数で複数の値を戻す

(1/1)
PHP の関数は、通常、1 つの値を return で戻す。では、2 つ以上の値を戻す場合にはどうすればよいか。
今回は座標変換を例に、2 つの値を戻す関数を作ってみることにする。

(2021 年 2 月 13 日)PHP8 対応

目次

サンプル・プログラムの実行例

PHPの関数で複数の値を戻す

サンプル・プログラム

圧縮ファイルの内容
wreturn.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。

測地系の違い

日本地図に記されている緯度・経度には 2種類の座標系がある。いわゆる「日本測地系」と「世界測地系」である。同じ緯度・経度でも、測地系が違うと、緯度・経度にして約 12秒、距離にして 300 メートルほど異なる。これは大きな違いだ。

明治初期、当時の東京天文台(東京都港区麻布台 2-18-1)で行った観測によって日本経緯度原点が定められた。ここを基準にした三角測量によって全国の緯度・経度が測定された。これが日本測地系である。
一方、GPS衛星で測量している世界測地系の一種を WGS-84 と呼ぶ。
日本測地系では、1841 年(天保 11 年)に定められたベッセル楕円体の地球の長半径(6,377,397.155m)を用いてきた。一方の世界措置系では、1980 年(昭和 55 年)に定められたGRS80 地球楕円体の長半径(6,378,137m)を利用している。同じ地点でも、測地系が違うと、緯度・経度にして 12秒の差が生じするのである。

測地系変換プログラム

0122: /**
0123:  * 世界測地系を日本測地系に変換する
0124:  * @param double $latitude  緯度(世界測地系)
0125:  * @param double $longitude 経度(世界測地系)
0126:  * @return double array(緯度,経度)(日本測地系)
0127: */
0128: function wgs84_tokyo($latitude$longitude) {
0129:     $lat_tokyo = $latitude  + $latitude * 0.00010696 - $longitude * 0.000017467 - 0.0046020;
0130:     $lng_tokyo = $longitude + $latitude * 0.000046047 + $longitude * 0.000083049 - 0.010041;
0131: 
0132:     return array($lat_tokyo$lng_tokyo);
0133: }

0135: /**
0136:  * 日本測地系を世界測地系に変換する
0137:  * @param double $lat_tokyo  緯度(日本測地系)
0138:  * @param double $lng_tokyo  経度(日本測地系)
0139:  * @return double array(経度,緯度)(世界測地系)
0140: */
0141: function tokyo_wgs84($lat_tokyo$lng_tokyo) {
0142:     $latitude  = $lat_tokyo - $lat_tokyo * 0.00010695  + $lng_tokyo * 0.000017464 + 0.0046017;
0143:     $longitude = $lng_tokyo - $lat_tokyo * 0.000046038 - $lng_tokyo * 0.000083043 + 0.010040;
0144: 
0145:     return array($latitude$longitude);
0146: }

そこで今回は、世界測地系を日本測地系に変換する wgs84_tokyo と、日本測地系を世界測地系に変換する tokyo_wgs84 の 2種類のユーザー関数を用意した。
いずれも、緯度・経度を引数とし、変換後の緯度・経度を戻す。
ここで問題なのが、2 つの戻り値があるということだ。

通常、PHP の関数は return 文で 1 つの値を返す。これを 2 つ返すためにどうしたらいいか。
ここでは配列を用いることにした。ユーザー関数側で  array  を使い、呼び出した側では  list  を使って受け取るのである。

配列を使うメリットは、戻り値が 3 つ、4 つ‥‥いくつあっても戻すことができる点である。

準備:pahooGeoCode クラス

0073: //住所・緯度・経度に関わるクラス:include_pathが通ったディレクトリに配置
0074: require_once('pahooGeoCode.php');

0349: //pahooGeoCodeクラス
0350: $pgc = new pahooGeoCode();

地図サービスを利用するために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

Yahoo! JAPAN Web サービスを利用するには Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPI の登録方法」を参照されたい。
また、地図として Google マップを利用するのであれば、Google Cloud Platform API キー が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を参照されたい。また、Google マップで経路探索を行う場合は、DirectionsService APIを有効にする必要がある。課金率が高いので留意されたい。

準備:地図サービス(WebAPI)の選択

0034: //地図サービス(WebAPI)の選択
0035: //    0:Google
0036: //    2:地理院地図・OSM
0037: define('MAPSERVICE', 2);

表示する地図は、Google マップと地理院地図・ OSM から選べる。
あらかじめ、定数 MAPSERVICE に値を設定すること。

参考サイト

(この項おわり)
header