カテゴリー
PHP

配列の要素を htmlspeciachars & htmlspeciachars_decode

htmlspecialchars/htmlspecialchars_decode でフォームへ表示するデータやポストされた文字列をhtmlエンティティにエンコードしたり、デコードしたり出来ます。配列の要素を行うには以下のようにすると出来ます。

<?php
$in1 = array('"', ''','&');
$in2 = array('<script>', '</script>');
$in = array(
        $in1,
        $in2
);
print_r(array_map('escapeHtml', $in1)); 
print_r(array_map('escapeHtml', $in2)); 
$out = array_map("escapeHtml", $in);
print_r($out);
print_r(array_map("decodeHtml", $out));

function escapeHtml($arg) {
    if (is_array($arg)) {
        return array_map('escapeHtml', $arg);
    } else {
        return htmlspecialchars($arg, ENT_QUOTES);
    }
}

function decodeHtml($arg) {
    if (is_array($arg)) {
        return array_map('decodeHtml', $arg);
    } else {
        return htmlspecialchars_decode($arg, ENT_QUOTES);
    }
}
?>

上記の出力結果:

Array
(
    [0] => &quot;
    [1] => '
    [2] => &amp;
)
Array
(
    [0] => &lt;script&gt;
    [1] => &lt;/script&gt;
)
Array
(
    [0] => Array
        (
            [0] => &quot;
            [1] => '
            [2] => &amp;
        )

    [1] => Array
        (
            [0] => &lt;script&gt;
            [1] => &lt;/script&gt;
        )

)
Array
(
    [0] => Array
        (
            [0] => "
            [1] => '
            [2] => &
        )

    [1] => Array
        (
            [0] => <script>
            [1] => </script>
        )

)
カテゴリー
PHP

PHP 5.1.6 とPHPExcel 1.7.6

現在の開発している環境は CentOS release 5.3 で PHP の 5.1.6 バージョンがインストールされています。

あるデータを Excel のブック形式で出力するために最新の PHPExcel 1.7.9 をダウンロードしてインストールして動かしみると簡単な表を作成するには問題なかったのですが、あるテンプレートとなるシートをコピーして、データ値をセットしようと考えてコードを書いて実行すると、シートをコピーするところでエラーとなってしまいました。

いろいろ試行錯誤したのですが回避できず、少し古いバージョンのPHPExcel 1.7.6 に入れ替えて試したら問題なくExcelへ出力することが可能となりました。

まあ、たまたま動いているだけかもしれませんが、参考までに。

カテゴリー
PHP

PHP 配列を任意順で並べ替え

配列の並べ替えで比較キーを任意順で並べ替えたい場合の参考に。。。
この例では配列の ‘kind’ という値を 3 < 4 < 1 < 2 という順番で並べ替えます。

<?php
// 配列
$operators = array ();
$operators[] = array('name' => 'foo1', 'kind' => '1');
$operators[] = array('name' => 'foo2', 'kind' => '2');
$operators[] = array('name' => 'foo3', 'kind' => '3');
$operators[] = array('name' => 'foo4', 'kind' => '4');
$operators[] = array('name' => 'foo5', 'kind' => '3');
$operators[] = array('name' => 'foo6', 'kind' => '3');
$operators[] = array('name' => 'foo7', 'kind' => '2');
$operators[] = array('name' => 'foo8', 'kind' => '4');
$operators[] = array('name' => 'foo9', 'kind' => '1');

// 並べ替え(kind が 3,4,1,2) の順
usort($operators, function($a, $b) {
    if ($a['kind'] == 3)
    {
        if ($b['kind'] == 3)
        {
            return 0;
        }
        return -1;
    }
    else if ($a['kind'] == 4)
    {
        if ($b['kind'] == 4)
        {
            return 0;
        }
        else if ($b['kind'] == 3)
        {
            return 1;
        }
        return -1;
    }
    else if ($a['kind'] == 1)
    {
        if ($b['kind'] == 1)
        {
            return 0;
        }
        else if ($b['kind'] == 2)
        {
            return -1;
        }
        return 1;
    }
    else if ($a['kind'] == 2)
    {
        if ($b['kind'] == 2)
        {
            return 0;
        }
        return 1;
    }
    return 0;
});

// ソート結果
foreach($operators as $ope)
{
    echo 'Name: '.$ope['name'].' (Kind: '.$ope['kind'].')'.PHP_EOL;
}
?>

実行結果:

Name: foo6 (Kind: 3)
Name: foo3 (Kind: 3)
Name: foo5 (Kind: 3)
Name: foo4 (Kind: 4)
Name: foo8 (Kind: 4)
Name: foo9 (Kind: 1)
Name: foo1 (Kind: 1)
Name: foo2 (Kind: 2)
Name: foo7 (Kind: 2)
カテゴリー
PHP

PHP error_log 関数でファイルへログ出力

error_log 関数でファイルへログ出力ができるので、クラスとして作成してみました。

<?php
#
# Logger
#
class MyLogger
{
    private $log_dir;
    private $log_fname;

    public function __construct($baseDir, $fname) {
        $this->log_dir = $baseDir;
        $this->log_fname = $fname;
    }

    public function Error($msg)
    {
        $log = "Error: ";
        $this->Output($log, $msg);
    }

    public function Info($msg)
    {
        $log = "Info: ";
        $this->Output($log, $msg);
    }

    protected function GetFileName()
    {
        $today = date("Ymd");
        return $this->log_dir."/".$today."_".$this->log_fname;
    }

    protected function Output($str, $msg)
    {
        $date = date("Y-m-d H:i:s");

        if (is_array($msg) || is_object($msg))
        {
            $log = "[".$date."]".$str.PHP_EOL;
            $log .= print_r($msg, true);
            $log .= PHP_EOL;
        }
        else
        {
            $log = "[".$date."]".$str.$msg.PHP_EOL;
        }
        error_log($log, 3, $this->GetFileName());
    }
}
// 実行
$log = new MyLogger('/tmp', 'test.log');
$log->Info('参考までに。');
$log->Error('大変だ。');
$arr = array('123','abc','xyz');
$log->Info($arr);
?>

出力例:

ログファイル名:/tmp/20140702_test.log
[2014-07-02 11:21:11]Info: 参考までに。
[2014-07-02 11:21:11]Error: 大変だ。
[2014-07-02 11:21:11]Info: 
Array
(
    [0] => 123
    [1] => abc
    [2] => xyz
)
カテゴリー
PHP

PHP implode で配列データをダブルクォートで囲む

配列の各要素を implode 関数をつかってカンマ区切りにして文字列として出力するのですが、さらに各要素をダブルクォーテーションで囲む方法です。

<?php
$arr = array('aaa','bbb','ccc','DDD','EEE');
$str = implode('","', $arr);
// --> aaa","bbb","ccc","DDD","EEE
$str = '"'.$str.'"';
// --> "aaa","bbb","ccc","DDD","EEE"
echo $str;
?>