PHP - よく使う関数 - ファイルシステム - その他


 クラウディア


1. 概要
2. parse_ini_file ini ファイルの読み込み
3. file_exists ファイルの有無を調べる
4. file_get_contents ファイルの内容を全て文字列に読み込む
5. file ファイル全体を読み込んで配列に格納する
6. fgetcsv CSV ファイルを1行読み込んで配列に格納する
7. 参考サイト

1. 概要

 本ページでは、前ページまでのこと以外の関数についてメモします。

2. parse_ini_file ini ファイルの読み込み

 「parse_ini_file()」は、「.ini」ファイルの読み込みを行います。

array parse_ini_file ( string $filename [, bool $process_sections = FALSE [, int $scanner_mode = INI_SCANNER_NORMAL ]] )
 「$filename」で指定したファイルを「PHP」の「php.ini」ファイルと同じ書式で読み込んで、配列の形式で返します。  配列の中身は、連想配列になっているようです。  2番目の引数は、省略すると「false」になりますが、「true」を指定するとセクションごとの連想配列になります。

[parse_ini_file]

a = hoge
b = fuga
c = #piyo
d = !moge
e = '!moge'

[FOO]

f = bar
 という「.ini」ファイルを用意し

<?php
$dir = dirname(__FILE__);
$inifile = $dir.'/parse_ini_file.ini';

$array = parse_ini_file($inifile);
print_r($array);

$array = parse_ini_file($inifile, true);
print_r($array);
 というソースを書いて実行すると下記の結果が得られます。

Array
(
    [a] => hoge
    [b] => fuga
    [c] => #piyo
    [d] => 1
    [e] => !moge
    [f] => bar
)
Array
(
    [parse_ini_file] => Array
        (
            [a] => hoge
            [b] => fuga
            [c] => #piyo
            [d] => 1
            [e] => !moge
        )

    [FOO] => Array
        (
            [f] => bar
        )

)
 注意すべきは、「!」の表記があるときの動きです。  マニュアルのどこかに書いているとは思うのですが、見つけられませんでした。  要は特殊文字があるときは、シングルコーテーションで囲んだ方がいいようです。  「\」コードをつけてエスケープしようとしたのですが、これはエラーになりました。

3. file_exists ファイルの有無を調べる


file_exists ( string $filename ) : bool
 指定した、ファイルが存在すれば「TRUE」、存在しなければ「FALSE」が返ります。

4. file_get_contents ファイルの内容を全て文字列に読み込む


file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] ) : string
 オープンしたり、クローズしたりの手間がないので、手っ取り早い。

5. file ファイル全体を読み込んで配列に格納する

 「PHP: file - Manual」参照。

file(string $filename, int $flags = 0, resource $context = ?): array
 「$filename」以外のオプション引数で、2番目の「$flags」に「FILE_IGNORE_NEW_LINES」を使用すると便利。  行末の改行を省略して取り込んでくれます。  下記のようなテキストファイルがあります。

aaaa
BBBB
cccc
 これを、べたな入出力を使うと。

$fp = fopen('/パス/ファイル名', "r");
$array = array();

if (flock($fp, LOCK_EX))
{
	while (($array[] = fgets($fp)) != false)
	{
	}

	flock($fp, LOCK_UN);
}

fclose($fp);

print_r($array);
 といささか長くなりますが、「file」で記述すると

$array = file('/パス/ファイル名', FILE_IGNORE_NEW_LINES);

print_r($array);
 てな感じで、簡潔に書けます。  上の例は、改行込みで取得しちゃってますが、下の例は改行を取っ払っちゃってるので、「print_r」に余分な改行が入りません。  ちょっと気になるのが、上の例では、「flock」してロックをかけていますが、下は大丈夫かな?と。  まぁ、一発で読み込んでるし、組み込みの関数なので大丈夫なのかな。  下を実行すると下記の結果が得られます。

Array
(
    [0] => aaaa
    [1] => BBBB
    [2] => cccc
)

6. fgetcsv CSV ファイルを1行読み込んで配列に格納する


fgetcsv(resource $stream, int $length = 0, string $separator = ",", string $enclosure = '"', string $escape = "\\"): array
 先頭の「$tream」は必須で、有効なファイルポインタを渡します。  「$length」は、行の最大の長さ。  「$separator」は、デリミタ (シングルバイト文字 1 文字のみ) を設定。  「$enclosure」は、フィールド囲いこみ文字 (シングルバイト文字 1 文字のみ) を設定。  「$escape」は、エスケープ文字 (シングルバイト文字 最大で1文字) を設定。

aaaa,1,はじめ
BBBB,2,おわり
 てな、「.csv」ファイルがありまして。

<?php

$fp = fopen(__DIR__."/file02.csv", "r");

if ($fp === FALSE)
{
	return;
}

while (($array = fgetcsv($fp)) !== FALSE)
{
	print_r($array);
}

fclose($fp);
 てなソースを書きまして(ファイル名やディレクトリは正しいものとします)、実行すると、下記の結果が得られます。

Array
(
    [0] => aaaa
    [1] => 1
    [2] => はじめ
)
Array
(
    [0] => BBBB
    [1] => 2
    [2] => おわり
)

7. 参考サイト

 本ページは、下記のサイトを参考にさせていただきました。
PHP: parse_ini_file - Manual