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秒の差が生じするのである。

測地系変換プログラム

 122: /**
 123:  * 世界測地系を日本測地系に変換する
 124:  * @param   double $latitude  緯度(世界測地系)
 125:  * @param   double $longitude 経度(世界測地系)
 126:  * @return  double array(緯度,経度)(日本測地系)
 127: */
 128: function wgs84_tokyo($latitude, $longitude) {
 129:     $lat_tokyo = $latitude  + $latitude * 0.00010696 - $longitude * 0.000017467 - 0.0046020;
 130:     $lng_tokyo = $longitude + $latitude * 0.000046047 + $longitude * 0.000083049 - 0.010041;
 131: 
 132:     return array($lat_tokyo, $lng_tokyo);
 133: }

 135: /**
 136:  * 日本測地系を世界測地系に変換する
 137:  * @param   double $lat_tokyo  緯度(日本測地系)
 138:  * @param   double $lng_tokyo  経度(日本測地系)
 139:  * @return  double array(経度,緯度)(世界測地系)
 140: */
 141: function tokyo_wgs84($lat_tokyo, $lng_tokyo) {
 142:     $latitude  = $lat_tokyo - $lat_tokyo * 0.00010695  + $lng_tokyo * 0.000017464 + 0.0046017;
 143:     $longitude = $lng_tokyo - $lat_tokyo * 0.000046038 - $lng_tokyo * 0.000083043 + 0.010040;
 144: 
 145:     return array($latitude, $longitude);
 146: }

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

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

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

準備:pahooGeoCode クラス

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

 349: //pahooGeoCodeクラス
 350: $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)の選択

  34: //地図サービス(WebAPI)の選択
  35: //    0:Google
  36: //    2:地理院地図・OSM
  37: define('MAPSERVICE', 2);

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

参考サイト

(この項おわり)
header