2012年07月06日

PHPでXMLファイルを読み込む

言語:PHP 5.3.13


PHPでXMLファイルを読み込むにはsimplexml_load_fileメソッドを使用します。

使い方は簡単で、引数に読み込みたいXMLファイル名を指定するだけです。

書式は以下のようになっています。
SimpleXMLElement simplexml_load_file(
    string $filename,
    string $class_name = "SimpleXMLElement",
    int $options = 0,
    string $ns = "",
    bool $is_prefix = false
)
$filename以外の引数は任意です。
殆どの場合は$filenameに読み込みたいXMLファイル名を指定するだけという使い方になると思います(私は他の引数は使ったことがないです)。
戻り値はSimpleXMLElementオブジェクトです。
このオブジェクトは要素名のプロパティーを持っています。

では、以下の内容のXMLファイル(sample.xml)を読み込ませてみます。
<?xml version="1.0" encoding="UTF-8" ?>
<items>
    <item>りんご</item>
    <item>ゴリラ</item>
    <item>ラッパ</item>
</items>


このファイルを読み込んで内容を表示するPHPプログラムは以下のようになります(たったの2行です...)。
<?php
    $xml = simplexml_load_file('sample.xml');

    var_dump($xml);
?>

実行すると以下のような出力内容になります。
object(SimpleXMLElement)#1 (1) {
  ["item"]=>
  array(3) {
    [0]=>
    string(9) "りんご"
    [1]=>
    string(9) "ゴリラ"
    [2]=>
    string(9) "ラッパ"
  }
}


2012年02月06日

PHPのベンチマークパッケージをインストール

言語:PHP 5.3.9
パッケージ:Benchmark-1.2.9

PHPにはBenchmarkというパッケージがあり、pearコマンドでインストールできます。
>pear install Benchmark


きちんとインストールされているかどうか確認するために、早速使ってみます。
hogeを10000回表示するのにかかる時間を測定します。
<?php

    require_once('Benchmark/Timer.php');

    $timer = new Benchmark_Timer();

    $timer->start();

    for ($i = 0; $i < 10000; $i++) {
    print("hoge\n");
    }
    $timer->setMarker('hoge');

    $timer->stop();
    $timer->display();

?>
エラー等が無く実行できればOKなはずです。
実行すると以下のような内容が出力されます(ちょっと見にくいですが、コンソール上ではもっと見やすく表示されます)。
hoge
.
.
.

hoge
hoge
hoge
----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1328443874.42238300   -                0.00%
----------------------------------------------------
hoge    1328443874.53056600   0.10818290710449  99.95%
----------------------------------------------------
Stop    1328443874.53061700   5.1021575927734E-5   0.05%
----------------------------------------------------
total   -                     0.10823392868042100.00%
----------------------------------------------------
Banchmarkパッケージが使えることが確認できます。

詳しい使い方は別のエントリで書きたいです。

2012年02月05日

PHPで文字列を1文字ずつに分割して配列に格納する -マルチバイト対応編-

言語:PHP 5.3.9

マルチバイト文字が含まれる文字列でも1文字ずつに分割して配列に格納するメソッドを書いてみました。
function my_mb_split($str, $enc='UTF-8')
{
    $charList = array();

    $len = mb_strlen($str, $enc);
    $i = 0;
    while ($i < $len)
    {
        $charList[] = mb_substr($str, $i++, 1, $enc);
    }
    return $charList;
}

この関数を使うと、マルチバイト文字列が1文字ずつ分割できました。
以下、サンプルコードです。
<?php

    function my_mb_split($str, $enc='UTF-8')
    {
        $charList = array();

        $len = mb_strlen($str, $enc);
        $i = 0;
        while ($i < $len)
        {
            $charList[] = mb_substr($str, $i++, 1, $enc);
        }
        return $charList;
    }

    $str = 'aあ1bい2cう3';

    $charList = my_mb_split($str);

    var_dump($charList);

?>

サンプルコードの実行結果は以下のようになります。
array(9) {
  [0]=>
  string(1) "a"
  [1]=>
  string(3) "あ"
  [2]=>
  string(1) "1"
  [3]=>
  string(1) "b"
  [4]=>
  string(3) "い"
  [5]=>
  string(1) "2"
  [6]=>
  string(1) "c"
  [7]=>
  string(3) "う"
  [8]=>
  string(1) "3"
}
しっかり分割できているのが判ります。
※PHPにはchar型に相当する型がないようなので、分割後の配列の要素も文字列型です。

2012年02月04日

php.iniのタイムゾーン(date.timezone)設定

言語:PHP 5.3.9

日時系の関数を使うと以下のようなワーニングが出ることがあります(実際に出たワーニングです)。
Warning: strftime() [function.strftime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. ...
システムのタイムゾーンを使っていて安全じゃないからdate.timezoneかdate_default_timezone_set()でタイムゾーンを設定しろっていうことです。

これを解決するためにdate.timezoneにタイムゾーンを設定することにしました。

やり方は、php.iniのDateセクション([Date]以下の部分)にdate.timezoneっていう項目があるので、そこを
date.timezone = "Asia/Tokyo"
にします。

これで、タイムゾーンの設定は終わりです。Apacheを再起動すれば設定が反映されます。

※Wikipediaによるとタイムゾーンとは、
共通の標準時を使う地域全体を「等時帯」、「時間帯」または「タイムゾーン(time zone)」といい、その地域の標準時を示す際にはUTCとの差で示すことが多い。
ということらしいです。結構良く使うけど、ちゃんとした意味って意外と知らなかったので、調べてみました。

2012年02月02日

PHPで文字列を1文字ずつに分割して配列に格納する -全角文字非対応編-

言語:PHP 5.3.9

あんまりこういうことをする機会ってないのですが、ちょっと必要になったので説明しておきます。

全角文字が含まれない文字列を1文字ずつに分割して配列に格納する方法です。

文字列を1文字ずつに分割するにはstr_split関数を使います。

使い方はサンプルコードで説明します。以下がサンプルコードです。
<?php

    $str = 'abc';

    $charList = str_split($str);

    var_dump($charList);

?>
実行すると以下のように表示されます。
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}
1文字ずつに分割できているのが確認できます。

ちなみにstr_split関数の引数に全角文字列を指定を指定すると、文字化けします。
以下サンプルコードです。
<?php

    $str = 'あいう';

    $charList = str_split($str);

    var_dump($charList);

?>
実行すると、以下のようになります。
array(9) {
  [0]=>
  string(1) "�"
  [1]=>
  string(1) "�"
  [2]=>
  string(1) "�"
  [3]=>
  string(1) "�"
  [4]=>
  string(1) "�"
  [5]=>
  string(1) "�"
  [6]=>
  string(1) "�"
  [7]=>
  string(1) "�"
  [8]=>
  string(1) "�"
}
文字化けしてうまくいかないです。