PHP

【PHP】CSVファイルを配列に変換して、API化させる!

近年ますます注目されている、API。

エンジニアをしていると、APIは「利用する」場合もあるし、「提供する」場合もあります。
APIを利用していくことで、より効率的に、高度な開発をすすめていくことが出来ます。

PHPで、APIを使ってみよう!的な記事を少し前に出しているので、
まだAPIについて詳しく分からない方は、ぜひこちらから読んでみてください!

今回は、APIを提供する側として解説していきます!

データベースを用いるケースが多いですが、
この記事ではCSVからデータを返すAPIを実装します。
やることは同じなので、まずはAPI開発の基礎を知りたい方というにオススメです。

それではいってみよう!!




完成イメージ

https://URL/api.php?station=名古屋

出力結果:

{
    "status": "200",
    "station_ido": "35.170694",
    "station_keid": "136.881637"
}
https://URL/api.php?station=東京

出力結果:

{
    "status": "500"
}
https://URL/api.php?station=

出力結果:

{
    "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ファイルを配列に変換して、検索できるようにする!という記事も書いています。
これが出来ると自分の身の回りでもかなり便利になります。

相談・質問を募集しています。

記事に関する相談・質問を募集しています。

是非この機会にどうぞ
コメントでの質問も大歓迎です!

ハヤぶろぐのLINE@登録はこちら


メールの方はこちら




-PHP