近年ますます注目されている、API。
エンジニアをしていると、APIは「利用する」場合もあるし、「提供する」場合もあります。
APIを利用していくことで、より効率的に、高度な開発をすすめていくことが出来ます。
PHPで、APIを使ってみよう!的な記事を少し前に出しているので、
まだAPIについて詳しく分からない方は、ぜひこちらから読んでみてください!
今回は、APIを提供する側として解説していきます!
データベースを用いるケースが多いですが、
この記事ではCSVからデータを返すAPIを実装します。
やることは同じなので、まずはAPI開発の基礎を知りたい方というにオススメです。
それではいってみよう!!
目次
完成イメージ
出力結果:
{ "status": "200", "station_ido": "35.170694", "station_keid": "136.881637" }
出力結果:
{ "status": "500" }
出力結果:
{ "status": "500" }
1.CSVファイルを用意する
東海道本線の名古屋周辺の駅の緯度経度をCSV化してみました。
「idokeid.csv」という名前で保存し、次で作成するPHPファイルと同じディレクトリに入れました。
【ファイル構成】
・idokeido.csv
・api.php
番号,緯度,経度
熱田,35.129976,136.910066
金山,35.143257,136.900947
尾頭橋,35.147042,136.890953
名古屋,35.170694,136.881637
枇杷島,35.199609,136.861202
清洲,35.224631,136.835504
稲沢,35.252374,136.821217
尾張一宮,35.301751,136.797083
木曽川,35.348885,136.780935
岐阜,35.409514,136.756521
西岐阜,35.404664,136.72341
穂積,35.396123,136.693306
大垣,35.366792,136.617638
垂井,35.369837,136.531307
関ヶ原,35.363726,136.470451
柏原,35.344593,136.402767
近江長岡,35.359307,136.373775
醒ヶ井,35.327664,136.345135
米原,35.314188,136.290488
2.CSVファイルを配列に格納する
CSVファイルを配列に格納していきましょう!
<?php
// 文字コード設定
header('Content-Type: application/json; charset=UTF-8');
//ファイルを変数に入れる
$csv_file = file_get_contents('idokeid.csv');
//変数を改行毎の配列に変換
$aryHoge = explode("\n", $csv_file);
$aryCsv = [];
foreach($aryHoge as $key => $value){
if($key == 0) continue; //1行目が見出しなど、取得したくない場合
if(!$value) continue; //空白行が含まれていたら除外
$aryCsv[] = explode(",", $value);
}
//配列に格納されたか確認
print_r($aryCsv);
実行してみて、次のように出力されていればOKじゃぞー!
Array ( [0] => Array ( [0] => 番号 [1] => 緯度 [2] => 経度 ) [1] => Array ( [0] => 熱田 [1] => 35.129976 [2] => 136.910066 [3] => ) [2] => Array ( [0] => 金山 [1] => 35.143257 [2] => 136.900947 [3] => ) //以下省略
3.パラメーターの有無を判定して、CSV検索する
//上記省略
//配列に格納されたか確認
//print_r($aryCsv);
$data = array();
//jsonとして返す用配列
//パラメーター有無確認
if(isset($_GET["station"])){
$data["status"] = "200";
$search = $_GET["station"];
$arySearch = array_search($search,array_column($aryCsv,0));//配列内検索
if($arySearch !== false){
//全体(参考用)
$result = $aryCsv[$arySearch];
//緯度部分
$result_id = $aryCsv[$arySearch][1];
//経度部分
$result_keid = $aryCsv[$arySearch][2];
$data["station_ido"] = $result_id;
$data["station_keid"] = $result_keid;
}else{
$data["status"] = "500";
}
}else{
$data["status"] = "500";
}
4.結果をJsonで返す
print json_encode($data, JSON_PRETTY_PRINT);
json_encode()の第二引数では、Json定数を指定することが出来ます。
JSON_PRETTY_PRINTを指定すると、改行やインデントを指定することが出来ます。
5.完成形コード・まとめ
<?php
// 文字コード設定
header('Content-Type: application/json; charset=UTF-8');
//ファイルを変数に入れる
$csv_file = file_get_contents('idokeid.csv');
//変数を改行毎の配列に変換
$aryHoge = explode("\n", $csv_file);
$aryCsv = [];
foreach($aryHoge as $key => $value){
if($key == 0) continue; //1行目が見出しなど、取得したくない場合
if(!$value) continue; //空白行が含まれていたら除外
$aryCsv[] = explode(",", $value);
}
//配列に格納されたか確認
//print_r($aryCsv);
$data = array();
//パラメーター有無確認
if(isset($_GET["station"])){
$data["status"] = "200";
$search = $_GET["station"];
$arySearch = array_search($search,array_column($aryCsv,0));//配列内検索
if($arySearch !== false){
//全体(参考用)
$result = $aryCsv[$arySearch];
//緯度部分
$result_id = $aryCsv[$arySearch][1];
//経度部分
$result_keid = $aryCsv[$arySearch][2];
$data["station_ido"] = $result_id;
$data["station_keid"] = $result_keid;
}else{
$data["status"] = "500";
}
}else{
$data["status"] = "500";
}
print json_encode($data, JSON_PRETTY_PRINT);
//出力結果:{ "status": "200", "station_ido": "35.170694","station_keid": "136.881637"}
?>
<経度の後ろに¥t¥yらしきものが付く場合>
CSVの各行の最後に空白などがある可能性があります。
各行の最後にも ,(カンマ)をつけてみると解決する場合があります。
いかがでしたでしょうか??
データベースに接続する場合も、配列に入れてJsonでエンコードするという流れは変わりません。
ぜひ活用してみてください。
API同様に、CSVファイルもかなり便利なものです。
CSVファイルを配列に変換して、検索できるようにする!という記事も書いています。
これが出来ると自分の身の回りでもかなり便利になります。