XamppやMamp等のローカル環境でPHPを使って複数のファイルを一度に生成する方法を紹介します。
今回は配列を使って、それぞれのデータを持ったHTMLファイルを別々のフォルダーに生成してみます。
まず、htdocs配下に以下のディレクトリ構造を作成していきます。
- create.php
- template.php
- data.php
- ファイル生成先のフォルダー
data.phpには、文字や数字等コンテンツの内容となる配列を記述します。
data.php
<?php
$kanto = array(
'tokyo' => array(
'name' => '東京都',
'population' => '12369185',
'area' => '2187.65'
),
'kanagawa' => array(
'name' => '神奈川県',
'population' => '8687422',
'area' => '2415.84'
),
'chiba' => array(
'name' => '千葉県',
'population' => '6028315',
'area' => '5156.60'
),
'saitama' => array(
'name' => '埼玉県',
'population' => '7037849',
'area' => '3797.25'
),
'ibaraki' => array(
'name' => '茨城県',
'population' => '2992152',
'area' => '6095.69'
)
);
この配列データを使って、各地方の情報を持ったHTMLファイルを別々に生成します。
次に、ファイルの生成を行うcreate.phpを作成します。
create.php
<?php
require_once dirname(__FILE__).'/data.php';//data.phpを読み込む
//読み込みエラーもしくは変数がない時の処理
if ($kanto === NULL) {
print("Could not read file");
return;
}
foreach ($kanto as $key => $val ) {
$url = "http://localhost/create_file/template.php?prefecture=".$key;
createFile($url,$key);
}
//ファイル生成の関数
function createFile($url,$key){
$buff = file_get_contents($url);//urlの内容を読み取る
$path="html/".$key."/";//生成するファイルのディレクトリ
chkDir($path);
$fname = "html/".$key."/index.html";//生成するファイルのディレクトリとファイル名
$fhandle = fopen( $fname, "w");//ファイルを書き込みモードで開く。
fwrite( $fhandle, $buff);//ファイルをバイナリモードで書き込む。第二引数に書き込みたい文字列
fclose( $fhandle );//ファイルポインタを閉じる
}
//ディレクトリのアクセス権の関数
function chkDir($path){
if(!file_exists($path)){
mkdir($path, 0777);//パーミッションを指定してフォルダーを生成
chmod($path, 0777);//Chmod関数でパーミッション変更
}
}
print("success");
少し複雑なので順番に説明していきます。
foreach ($kanto as $key => $val ) {
$url = "http://localhost/create_file/template.php?prefecture=".$key;
createFile($url,$key);
}
foreach内では、読み込んだdata.phpの配列をループさせて、template.phpのURLにそれぞれクエリパラメータを渡していきます。
その後、createFile()関数で各ファイルを作成しています。
function createFile($url,$key){
$buff = file_get_contents($url);//urlの内容を読み取る
$path="html/".$key."/";//生成するファイルのディレクトリ
chkDir($path);
$fname = "html/".$key."/index.html";//生成するファイルのディレクトリとファイル名
$fhandle = fopen( $fname, "w");//ファイルを書き込みモードで開く。
fwrite( $fhandle, $buff);//ファイルをバイナリモードで書き込む。第二引数に書き込みたい文字列
fclose( $fhandle );//ファイルポインタを閉じる
}
createFile()関数では、file_get_contents()関数でurlの内容をすべて読み取り、fwrite()関数で第一引数のファイルに第二引数の内容を書き込みます。
第一引数には、書き込みたいファイルをあらかじめfopen()関数の書き込みモードで開き、それを代入した変数を入れています。
第二引数には先ほどfile_get_contents()で取得したurlの変数を入れています。
また、途中でchkDir()関数で、生成するファイルのディレクトリが存在するかどうかチェックしています。
function chkDir($path){
if(!file_exists($path)){
mkdir($path, 0777);//パーミッションを指定してフォルダーを生成
chmod($path, 0777);//Chmod関数でパーミッション変更
}
}
chkDir()関数では、生成されたファイルのディレクトリが存在しなかった場合、パーミッションを0777にしてディレクトリを作成しています。
chomod()関数は、OSの設定でパーミッションがうまく指定できなかったときでも0777にする保険として記述しています。
最後に、生成するHTMLファイルの型となるtemplate.phpを作成していきます。
template.php
<?php
require_once dirname(__FILE__).'/data.php';//data.phpを読み込む
if ($_SERVER['REQUEST_METHOD'] === 'GET'){
$prefecture=null;
//$_GETでパラメータから値を取得してnullでないか調べる
if(isset($_GET["prefecture"])){
$prefecture=$_GET["prefecture"];//取り出した値を変数に格納
if ($kanto === NULL) {
return;
}
//配列から各値を取り出す
$name = $kanto[$prefecture]["name"];
$population = $kanto[$prefecture]["population"];
$area = $kanto[$prefecture]["area"];
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $name ;?>のデータ</title>
</head>
<body>
<h1><?php echo $name ;?></h1>
<p>人口:<?php echo number_format($population) ;?></p>
<p>面積:<?php echo $area ;?>km²</p>
<p>人口密度:<?php echo floor($population / $area) ;?></p>
</body>
</html>
ここでは、先ほどcreate.phpで作成したURLパラメータからGETを使って値を取り出しています。
そして、そのパラメータから取り出した値を利用して、data.phpの配列から各値を取り出して変数に格納しています。
テンプレートとなるHTMLには、変数を使って記述していきます。
これで準備は整いました。あとは生成するだけです。
そのままlocalhostのURLにアクセスしても良いですが、それより簡単なのがコマンドプロンプトのコマンド入力です。
各phpファイルを作成したディレクトリでコマンドプロンプトを起動して、php create.phpとコマンド入力するだけです。
php create.php
うまくいけばsuccessが返ってきます。
これでhtmlフォルダーの中にHTMLファイルを持つ各フォルダーが作成されました。
各フォルダーの中にもきちんとテンプレートに沿ったindex.htmlが生成されています。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>千葉県のデータ</title>
</head>
<body>
<h1>千葉県</h1>
<p>人口:6,028,315</p>
<p>面積:5156.60km²</p>
<p>人口密度:1169<span>(1km²あたり)</span></p>
</body>
</html>
意外と簡単にできてしまうので効率よく作業をするために是非使っていきましょう。
他にもこんな記事があります。