print_r($array)は、配列やオブジェクトをキーと値付きの読みやすい形で出力します。var_dump($value)は同じ構造に加えて、すべての値の型と長さを出力します。配列に何が入っているかを見るならprint_rを、値が"1"なのか1なのかを知る必要があるならvar_dumpを使います。
2つの出力のadminを比べてください。print_rは矢印のあとに何も出力していませんが、var_dumpはbool(false)と出力しています。この違いが、デバッグ中にvar_dumpを選ぶいちばんの理由です。
print_r、var_dump、var_exportの違い
3つの関数は同じデータを異なる詳しさで表示します。
print_r | var_dump | var_export | |
|---|---|---|---|
| 型を表示する | しない | する | PHPのリテラルとして |
false、null、"" | 何も出力しない | bool(false), NULL, string(0) "" | false, NULL, '' |
| 文字列を返せる | print_r($x, true) | できない | var_export($x, true) |
| 出力が正しいPHP | ではない | ではない | である |
| 1回の呼び出しで複数の値 | できない | var_dump($a, $b) | できない |
print_rはいちばん読みやすく、var_dumpはいちばん正確で、var_exportはファイルに貼り戻せるコードを返します。
print_rの出力を文字列として得る
2つ目の引数にtrueを渡すと、print_rは出力せずにテキストを返します。配列をログファイルに書いたり、もっと大きなメッセージの中に入れたりする方法です。
var_export($value, true)も同じように文字列を返します。var_dumpは常に出力するので、取り込むには出力バッファリングが必要です:ob_start(); var_dump($x); $text = ob_get_clean();。
preを使ってHTMLで配列を整形表示する
ブラウザでは、HTMLが空白を無視するので、print_rの改行と空白はつぶれて1行の長い行になります。レイアウトを保つには、出力を<pre>で包みます。実行してPageタブを見てください。
ユーザーの入力のように、データに<や&が含まれうるとたんにhtmlspecialcharsが重要になります。それがなければ、ブラウザはそのテキストをHTMLとして扱ってしまいます。JavaScriptやAPIに送るデータには、json_encodeの形がいちばん役立つことがよくあります。
複数の値を一度にダンプする
var_dumpは引数をいくつでも受け取り、順に出力するので、2つの値を並べて比べるのに手軽です。
出力を見ると、==が等しいと言い===が言わない理由がわかります。一方はstring(2) "42"、もう一方はint(42)です。
オブジェクトを出力する
3つの関数はオブジェクトも出力します。var_dumpとprint_rはprivateとprotectedのプロパティに印を付けるので([label:Point:private])、プロパティが見当たらないように思えるときに役立ちます。
var_dumpの出力の#1はオブジェクトのIDです。同じIDを表示する2つの変数は、同じオブジェクトを指しています。
よくあるミス:配列をechoする
echoは引数を文字列に変えます。配列には文字列の形がないので、PHPはArrayという単語を出力し、警告を出します。
<?php
$colors = ["red", "green", "blue"];
echo $colors;
PHPの出力:
Warning: Array to string conversion in /home/index.php on line 3
Array
上の関数のどれかで中身を出力するか、自分で値をつなぎます。
implodeはユーザーにリストを見せるため、json_encodeはログやAPIのため、print_rやvar_dumpは自分のデバッグのためのものです。
よくある質問
var_dumpとprint_rの違いは何ですか?
print_rはキーと値を短く読みやすい形で表示します。var_dumpはstring(3) "Ada"やbool(false)のように各値の型と長さも表示するので、型が重要なときはこちらを使います。print_r(false)は何も出力しませんが、var_dump(false)はbool(false)と出力します。
print_rの出力を文字列として得るには?
2つ目の引数にtrueを渡します:$text = print_r($array, true);は出力せずにテキストを返すので、error_log($text)でログに書いたり変数に入れたりできます。var_export($value, true)も同じように動きますが、var_dumpにはそのようなオプションがありません。
ブラウザで配列をきれいに表示するには?
ブラウザが改行とインデントを保つよう、出力を<pre>タグで包みます:echo '<pre>' . print_r($array, true) . '</pre>';。データにHTMLが含まれうるなら、htmlspecialcharsでエスケープします。
配列をechoするとArrayと表示されるのはなぜですか?
echoは引数を文字列に変換し、配列は「Array to string conversion」の警告付きでArrayという単語に変換されるからです。中身を出力するには、print_r、var_dump、implode(', ', $arr)、json_encode($arr)を使います。
PHPのvar_exportは何をしますか?
値を、スクリプトに貼り戻せる正しいPHPのコードとして出力します。たとえばarray ( 0 => 'a', )です。2つ目の引数にtrueを渡すとコードを文字列として返し、一部のツールはこの方法でキャッシュした設定ファイルを書き出します。