Menu

PHPのvar_dump()とprint_r():配列の表示とデバッグ

print_r($array)は配列を読みやすい形で出力し、var_dump($value)はすべての型と長さも表示し、var_exportは正しいPHPのコードを出力します。それぞれの使いどころ、print_rを文字列として得る方法、<pre>を使ったHTMLでの整形表示を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

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_rvar_dumpvar_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を渡すとコードを文字列として返し、一部のツールはこの方法でキャッシュした設定ファイルを書き出します。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める