Excelに書いた表をどこでも見れるようにしたい!
出来れば、スマホで検索出来る形式だったらなおいい!!
みたいにに思ったので、思わず実装してみました。
今回は、PHPを用いて、CSVから配列へ変換、そして検索機能を付けていきたいと思います♪
使用するCSVファイルはこちら下記のとおりです!
(サンプルとしてJR東海道本線の駅名と緯度、経度で用意しました。)
Excelの罫線を消して、「,」区切りにしたものが、csvファイルです。
Excelの書き出し形式で選ぶことが出来ます。
【CSV】
番号,緯度,経度
熱田,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
こちらのCSVファイルが最終的には、こうなります!
(実際に動作します。岐阜 大垣 名古屋 などと入力してみてください)
目次
ファイル構成
【ファイル構成】
・idokeido.csv
・idokeido.php
csvを配列に格納する
csvファイルと同じディレクトリ内に、idokeido.phpを作成しました。
<?php
//ファイルを変数に入れる
$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);
?>
一度、サーバーにアップして確認をしてみます。(またはXAMMPなどのローカル環境にて確認)
Array ( [0] => Array ( [0] => 熱田 [1] => 35.129976 [2] => 136.910066 ) [1] => Array ( [0] => 金山 [1] => 35.143257 [2] => 136.900947 ) [2] => Array ( [0] => 尾頭橋 [1] => 35.147042 [2] => 136.890953 ) [3] => Array ( [0] => 名古屋 [1] => 35.170694 [2] => 136.881637 ) [4] => Array ( [0] => 枇杷島 [1] => 35.199609 [2] => 136.861202 ) [5] => Array ( [0] => 清洲 [1] => 35.224631 [2] => 136.835504 ) [6] => Array ( [0] => 稲沢 [1] => 35.252374 [2] => 136.821217 ) [7] => Array ( [0] => 尾張一宮 [1] => 35.301751 [2] => 136.797083 ) [8] => Array ( [0] => 木曽川 [1] => 35.348885 [2] => 136.780935 )……省略
多次元配列の形になりました!
補足
explode関数にて、改行区切りや,(カンマ)区切りに文字列を分割することが出来ます。
配列から検索機能を実装する
配列の形となったデータを用いて、各駅名で緯度、経度を割り出せるようにしていきます。
先ほどのphp分の下に、下記のHTMLコードを追加して、検索フォームを作成します。
--省略--
?>
<!--抜き出す-->
<form action="" method="post">
<label>駅名:<input type="text" name="station" value="<?php echo htmlspecialchars($station, ENT_QUOTES, "UTF-8"); ?>" maxlength="8"> </label>
<input type="submit" value="検索する">
</form>
<p id="result">調べたい駅名を入力してください。</p>
補足〜formタグ〜
HTMLのformタグを用いて、入力された駅名を自分にpostします。
今回は本来必要ないかと思いますが、inputタグはセキュリティの兼ね合いから、
htmlspecialchars()と最大入力数を加えています。
次に、POSTしたデータを受け取るプログラムを冒頭に追加します。
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$station = $_POST['station'];
}
//ファイルを変数に入れる --以下省略--
補足〜postの受け取り〜
postが合ったときに、受け取るようにします。
受け取ったデータ(入力された駅名)は、$stationに代入しておきます。
ここから、受け取った駅名をもとに、配列内から検索していきます。
僕は、検索フォームのHTMLの下に記述しました。
--上記省略--
<?php
if(isset($station)){
$search = $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];
//var_dump($result_keid);
print '<script>';
print "const result = document.getElementById('result'); result.innerText = '緯度:'+$result_id+'/経度:'+$result_keid;";
print '</script>';
}else
{
$alert = "<script type='text/javascript'>alert('駅名が見つかりませんでした');</script>";
echo $alert;
}
}
補足〜配列内への存在のチェック〜
isset関数を用いて、$stationが存在するか確認してから実行します。
postされてから実行される流れを作ります。
array_column関数にて、配列の0カラム(=駅名)のみ抽出します。
そしてarray_search関数にて、入力された駅名の存在をチェックします。
存在がない場合はfalse、ある場合は最初のキーを返します。
if($arySearch !== false){ ~
にて配列内に入力された駅名と一致するものがあった場合となかった場合の処理を記入します。
array_serch関数で、返り値が"0"となった場合の対応には注意が必要です。
if($arySearch == false)という書き方だと"0"のときに返りません。"0"はfalseとみなされるためです。
今回でいうと、配列の最初に格納されている「熱田」と入力した場合に発生します。
そこで、if($arySearch !== false)に変更し対応しました。
(これで「熱田」と入力しても正常に結果を返してくれます)
これで実行してみると、冒頭のような検索機能が実装されました♪
完成形プログラム・まとめ
以下が、今回のコードをまとめた完成形です。
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$station = $_POST['station'];
}
//ファイルを変数に入れる
$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);
?>
<!--抜き出す-->
<form action="" method="post">
<label>駅名:<input type="text" name="station" value="<?php echo htmlspecialchars($station, ENT_QUOTES, "UTF-8"); ?>" maxlength="8"> </label>
<input type="submit" value="検索する">
</form>
<p id="result">調べたい駅名を入力してください。</p>
<?php
if(isset($station)){
$search = $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];
//var_dump($result_keid);
print '<script>';
print "const result = document.getElementById('result'); result.innerText = '緯度:'+$result_id+'/経度:'+$result_keid;";
print '</script>';
}else
{
$alert = "<script type='text/javascript'>alert('駅名が見つかりませんでした');</script>";
echo $alert;
}
}
?>
もし、おかしな点や間違いがありましたらメッセージいただけましたら、大変嬉しいです。
ありがとうございました♪