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

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

(2025年8月22日).pahooEnv 導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.

目次

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

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

サンプル・プログラム

圧縮ファイルの内容
wreturn.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
wreturn.php 更新履歴
バージョン 更新日 内容
1.2.0 2025/08/22 .pahooEnv 導入
1.1 2021/02/13 PHP8対応
1.0 2015/11/22 初版
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.8.0 2025/08/10 アクセスキーなどを ".env" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
6.6.0 2025/07/19 drawJSmap,drawGMap,drawLeaflet -- マップ中心マーカー表示引数を追加
6.5.0 2025/06/14 GoogleMaps JavaScript APIの変更に対応
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

測地系の違い

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

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

測地系変換プログラム

wreturn.php

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

wreturn.php

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

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

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

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

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooGeoCode クラス

pahooGeoCode.php

  40: class pahooGeoCode {
  41:     public $items;      // 検索結果格納用
  42:     public $error;      // エラー・フラグ
  43:     public $errmsg;     // エラー・メッセージ
  44:     public $hits;       // 検索ヒット件数
  45:     public $webapi// 直前に呼び出したWebAPI URL
  46: 
  47:     // -- 以下のデータは .env ファイルに記述可能
  48:     // Google Cloud Platform APIキー
  49:     // https://cloud.google.com/maps-platform/
  50:     // ※Google Maps APIを利用しないのなら登録不要
  51:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  52:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  53:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  54: 
  55:     // Yahoo! JAPAN Webサービス アプリケーションID
  56:     // https://e.developer.yahoo.co.jp/register
  57:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  58:     public $YAHOO_APPLICATION_ID = '';
  59: 
  60:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  61:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  62:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  63:     public $NOMINATIM_EMAIL = '';
  64: 
  65:     // IP2Location.io APIキー
  66:     // https://www.ip2location.io/
  67:     // ※IP2Location.ioを利用しないのなら登録不要
  68:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

地図や住所検索として Google を利用するのであれば Google Cloud Platform APIキーマップID が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、IP2Location.ioを利用するのであれば「PHPでIPアドレスやホスト名から住所を求める」を、それぞれ参照されたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

wreturn.php

  52: // 各種定数(START) ===========================================================
  53: 
  54: // 地図描画サービスの選択
  55: //    0:Google
  56: //    2:地理院地図・OSM
  57: define('MAPSERVICE', 2);
  58: 
  59: // マップの表示サイズ(単位:ピクセル)
  60: define('MAP_WIDTH',  600);
  61: define('MAP_HEIGHT', 400);
  62: // マップID
  63: define('MAPID', 'map_id');
  64: // 初期値
  65: define('DEF_LATITUDE',  35.4658);       // 緯度
  66: define('DEF_LONGITUDE', 139.6223);      // 経度
  67: define('DEF_TYPE',      'roadmap');     // マップタイプ
  68: define('DEF_ZOOM',      13);            // ズーム
  69: 
  70: // 各種定数(END) ===============================================================

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

参考サイト

(この項おわり)
header