かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP 配列の内容をログにとりたい。

PHPデバッグフレームワークで渡される配列を展開してログに吐きたい時のメモ。

要するにRubyとかのArray.to_sみたいな感じで展開してログに吐き出したいわけです。
PHPでは配列をそのままerror_logに渡しても上手く書き出せません。

<?php
$arr = ["Akatsuki", "Hibiki", "Ikazuchi", "Inazuma"];
error_log($arr . "\n", 3, $logfile);

↓ログファイルの出力結果

Array

print_r で配列を展開して書き出せる

print_rの第二引数にtrueを渡すと文字列で結果が返ってくるっぽいので、これを利用してログに配列を展開して吐き出すことができます。

<?php
$arr = ["Akatsuki", "Hibiki", "Ikazuchi", "Inazuma"];
error_log(print_r($arr, true), 3, $logfile);

↓ログファイルの出力結果

Array
(
    [0] => Akatsuki
    [1] => Hibiki
    [2] => Ikazuchi
    [3] => Inazuma
)

オブジェクト(連想配列)でも綺麗にログに書き出すことができました。

<?php
$arr =  [
  "type"  => "destroyer",
  "class" => "Type III (Akatsuki)",
  "ships" => ["Akatuki", "Hibiki", "Ikazuchi", "Inazuma"]
];
error_log(print_r($arr, true), 3, $logfile);

↓ログファイルの出力結果

Array
(
    [type] => destroyer
    [class] => Type III (Akatsuki)
    [ships] => Array
        (
            [0] => Akatuki
            [1] => Hibiki
            [2] => Ikazuchi
            [3] => Inazuma
        )

)

note.

配列を文字列に結合するimplode()関数ってのもありますが、これだとオブジェクト(連想配列)の時にキーは無視されて値だけで結合されてしまうので、タダの配列だと判っている時以外はダメかなーと思いました。

<?php
$arr =  [
  "type"  => "destroyer",
  "class" => "Type III (Akatsuki)",
  "ships" => ["Akatuki", "Hibiki", "Ikazuchi", "Inazuma"]
];
error_log(implode("\n",$arr), 3, $logfile);

↓ログファイルの出力結果

destroyer
Type III (Akatsuki)
Array

 
という事で、ログへの吐き出しはprint_r($array, true)とするのが便利そうです。
ログ以前に行末に;つけ忘れてエラーになりまくるのでPHP辛い...


[参考]

人生は1冊のノートにまとめなさい―体験を自分化する「100円ノート」ライフログ

人生は1冊のノートにまとめなさい―体験を自分化する「100円ノート」ライフログ