PHPで配列の値をファイルに出力

(1/1)
PHPでプログラムをつくる際、データをファイルに保存しておきたい場面がよくあるだろう。そこで今回は、配列の値をファイルに出力する方法として、serialize, JSON, XMLの3つを紹介する。

(2021年5月12日)PHP8対応,リファラ・チェック追加

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

PHPで配列の値をファイルに出力

目次

サンプル・プログラム

圧縮ファイルの内容
array2file.phpサンプル・プログラム本体。
サンプル・プログラムは、実際にファイルに出力するのではなく画面に表示するようにしてあるが、コメントアウトを取り払うことでファイルへの入出力ができるようになっている。

準備

  34: //表示幅(ピクセル)
  35: define('WIDTH', 600);
  36: 
  37: //配列
  38: $Items = array(
  39: array('name'=>'武田信虎', 'birth'=>1494, 'death'=>1574, 'comment'=>'甲斐の守護大名・戦国大名。武田信玄の父。'),
  40: array('name'=>'フランシスコ・ザビエル', 'birth'=>1506, 'death'=>1552, 'comment'=>'キリスト教宣教師。イグナティウス=デ=ロヨラとともにイエズス会を設立、鹿児島に上陸し、日本に初めてキリスト教を伝える。'),
  41: array('name'=>'今川義元', 'birth'=>1519, 'death'=>1560, 'comment'=>'戦国大名。駿河・遠江・三河を治め、京都上洛を狙うが、桶狭間の戦いで織田信長の奇襲を受け、敗死した。'),
  42: array('name'=>'武田信玄', 'birth'=>1521, 'death'=>1573, 'comment'=>'武将。父、信虎を追放して家督を継ぎ、信濃に進出。越後の上杉謙信と川中島で激戦を展開する。三方ヶ原の戦いで徳川家康を破るも、翌年、病没する。'),
  43: array('name'=>'千利休', 'birth'=>1522, 'death'=>1591, 'comment'=>'茶人。千家流茶道の開祖。織田信長や豊臣秀吉に仕え、政治にも参画したが、秀吉の怒りを買い自刃。'),
  44: array('name'=>'明智光秀', 'birth'=>1528, 'death'=>1582, 'comment'=>'武将。織田信長に重用されたが、本能寺で信長を襲い自害させた。山崎の戦いで秀吉に敗れ、土民に殺された。'),
  45: array('name'=>'上杉謙信', 'birth'=>1530, 'death'=>1578, 'comment'=>'武将。越後守護代・長尾為景の子。武田信玄と川中島において激戦を展開する。'),
  46: array('name'=>'織田信長', 'birth'=>1534, 'death'=>1582, 'comment'=>'武将。今川義元を桶狭間の戦いで破り、天下布武を実行する。将軍・足利義昭を追放し室町幕府を滅亡させ、安土城を築いて全国統一に乗り出す。明智光秀の急襲により、本能寺で自刃。'),
  47: array('name'=>'豊臣秀吉', 'birth'=>1536, 'death'=>1598, 'comment'=>'武将。織田信長に仕え、頭角をあらわす。本能寺の変の後、明智光秀を討ち、1590年に天下を統一。関白、太政大臣となる。朝鮮に出兵するも戦果があがらないまま、伏見城で病没。'),
  48: array('name'=>'徳川家康', 'birth'=>1542, 'death'=>1616, 'comment'=>'江戸幕府初代将軍(1603~1605)。三河岡崎城主・松平広忠の長男。今川義元の人質から解放され、織田信長、豊臣秀吉に協力。秀吉の死後、関ヶ原の戦いで勝利し、1603年、征夷大将軍となる。'),
  49: array('name'=>'武田勝頼', 'birth'=>1546, 'death'=>1582, 'comment'=>'武将。信玄の子。長篠の戦いで織田・徳川軍に破れ、自刃。武田氏は滅亡する。'),
  50: array('name'=>'石田三成', 'birth'=>1560, 'death'=>1600, 'comment'=>'武将。豊臣秀吉に重用されるも、関ヶ原の戦いに敗れ、斬首された。'),
  51: array('name'=>'豊臣秀頼', 'birth'=>1593, 'death'=>1615, 'comment'=>'豊臣秀吉の子。徳川秀忠の娘千姫と結婚して右大臣となるも、大坂の陣で徳川氏に敗れ、大坂城で自刃。')
  52: );

ファイルに保存したい配列を $Items に用意する。ここでは連想配列を用意した。

解説:serialize

 156:     //シリアライズ
 157:     $str1 = serialize($arrs);
 158: //  $filename1 = 'hoge.txt';
 159: //  file_put_contents($filename1, $str1);                   //ファイル出力
 160: //  $arrs = unserialize(file_get_contents($filename1));     //読み込み

PHPで配列をファイルに出力するのに最も簡便な方法は、組み込み関数  serialize  を用いるものである。

 serialize  は、引数として任意の形式の変数を与えると、それを文字列形式で返してくる。配列の構造を意識する必要はない。返された文字列をファイルに保存すれば良い。
この形式はPHP固有のものであり、他の処理系ではそのまま扱うことはできない。

また、ファイルに保存されたテキストを、組み込み関数  unserialize  を通してやれば、元の変数に戻すことができる。
ファイル保存と読み込み処理は、コメントアウトしてある通りである。

解説:JSON形式

 162:     //JSON形式
 163:     $str2 = json_encode($arrs);
 164: //  $filename2 = 'hoge.json';
 165: //  file_put_contents($filename2, $str2);                   //ファイル出力
 166: //  $arrs = json_decode(file_get_contents($filename2));     //読み込み

PHPで配列をファイルに出力する次の方法は、組み込み関数  json_encode  を用いるものである。
JSON形式(JavaScript Object Notation)とは、JavaScriptでオブジェクトの値を表現するために制定された方式である。その名の通り、JavaScriptで扱うことができるほか、さまざまな処理系で扱うことができる。

 json_encode  は、引数として任意の形式の変数を与えると、それをJSON形式の文字列で返してくる。配列の構造を意識する必要はない。返された文字列をファイルに保存すれば良い。

また、ファイルに保存されたテキストを、組み込み関数  json_decode  を通してやれば、元の変数に戻すことができる。
ファイル保存と読み込み処理は、コメントアウトしてある通りである。

なお、JSON関数はPHP5以上でないと使えない。

解説:XML形式

 168:     //XML形式
 169:     $xmlstr = "<?xml version=\"1.0\" ?><root></root>";
 170:     $xml = new SimpleXMLElement($xmlstr);
 171:     foreach ($arrs as $arr) {
 172:         $xmlitem = $xml->addChild('item');
 173:         foreach ($arr as $key=>$value){
 174:             $xmlitem->addChild($key, $value);
 175:         }
 176:     }
 177:     //XML整形:DOMDocument利用
 178:     $dom = new DOMDocument('1.0', INTERNAL_ENCODING);
 179:     $node = $dom->importNode(dom_import_simplexml($xml), TRUE);
 180:     $dom->appendChild($node);
 181:     $dom->preserveWhiteSpace = FALSE;       //余分な空白を除去
 182:     $dom->formatOutput = TRUE;              //整形出力
 183:     $str3 = $dom->saveXML();
 184: //  $filename3 = 'hoge.xml';
 185: //  $dom->save($filename3);                         //ファイル出力
 186: //  $xml = simplexml_load_file($filename3);         //読み込み
 187: //  $arrs = get_object_vars($xml);

PHPで配列をファイルに出力する最後の方法として、SimpleXML を用い、XML形式に変換するものを紹介する。
XML形式(ExtensibleMarkupLanguage)とは、1998年(平成10年)にW3Cにより勧告された言語であるが、さまざまな形式のデータを扱うことができる形式として、インターネットを中心に広く普及している。JavaやMicrosoft系開発言語でも扱うことができる。

ここでは、ノード item の下に配列をぶら下げる構造とした。
まず、SimpleXMLElement オブジェクトを生成し、addChild を使って、配列の値を子要素として追加していく。

次に、XMLオブジェクトを文字列に変換する手順だが、asXML を使えば簡単に実現できるのだが、空白や改行がないなど読みにくい。
そこで、XMLオブジェクトを DOMDocument クラスに渡し、DOMDocumentのメソッドを使って整形することにした。
saveXML で返された文字列をファイルに保存すれば良い。

また、ファイルに保存されたテキストを、組み込み関数  simplexml_load_file  を通してやれば、XMLオブジェクトとして取り出すことができる。さらに  get_object_vars  を通してやれば、元の変数に戻すことができる。
ファイル保存と読み込み処理は、コメントアウトしてある通りである。

なお、SimpleXMLはPHP5以上でないと使えない。
また、この部分の処理は2次元配列に限定している。任意の構造の配列に適用するには、再帰呼び出しを行うなど工夫が必要である。

参考サイト

(この項おわり)
header