print_r($array) выводит массив или объект с ключами и значениями в читаемом виде. var_dump($value) выводит ту же структуру плюс тип и длину каждого значения. Используйте print_r, чтобы увидеть, что лежит в массиве, и var_dump, когда нужно знать, это "1" или 1.
Сравните два вывода для admin: print_r ничего не вывел после стрелки, а var_dump вывел bool(false). Это главная причина брать при отладке var_dump.
print_r, var_dump и var_export
Три функции показывают одни и те же данные с разной детализацией:
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 | нет | нет | да |
| Несколько значений за один вызов | нет | var_dump($a, $b) | нет |
print_r читается легче всего, var_dump точнее всего, а var_export даёт код, который можно вставить обратно в файл.
Вывод print_r в виде строки
Передайте true вторым аргументом, и print_r вернёт текст, а не напечатает его. Так массив записывают в лог-файл или вставляют в более длинное сообщение.
var_export($value, true) возвращает строку так же. var_dump всегда печатает, поэтому чтобы поймать его вывод, нужна буферизация вывода: ob_start(); var_dump($x); $text = ob_get_clean();.
Красивый вывод массива в HTML через pre
В браузере переносы строк и пробелы print_r схлопываются в одну длинную строку, потому что HTML игнорирует пробельные символы. Оберните вывод в <pre>, чтобы сохранить разметку. Запустите и посмотрите на вкладку Page.
htmlspecialchars становится важен, как только в данных может оказаться < или &, например в пользовательском вводе: без него браузер воспримет такой текст как HTML. Для данных, которые вы отправляете в JavaScript или API, часто удобнее всего форма json_encode.
Вывод нескольких значений сразу
var_dump принимает любое число аргументов и выводит их по очереди, так удобно быстро сравнить два значения рядом.
Вывод показывает, почему == считает их равными, а === нет: одно это string(2) "42", другое int(42).
Вывод объектов
Все три функции выводят и объекты. var_dump и print_r помечают закрытые и защищённые свойства ([label:Point:private]), что помогает, когда свойство будто бы пропало.
#1 в выводе var_dump это id объекта. Две переменные, у которых показан один и тот же id, указывают на один объект.
Частая ошибка: 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 в виде строки?
Передайте true вторым аргументом: $text = print_r($array, true); возвращает текст, а не печатает его, поэтому его можно записать в лог через error_log($text) или положить в переменную. var_export($value, true) работает так же; у var_dump такой опции нет.
Как красиво вывести массив в браузере?
Оберните вывод в тег <pre>, чтобы браузер сохранил переносы строк и отступы: echo '<pre>' . print_r($array, true) . '</pre>';. Экранируйте его через htmlspecialchars, если в данных может быть HTML.
Почему echo для массива выводит Array?
echo приводит аргумент к строке, а массив превращается в слово Array с предупреждением "Array to string conversion". Чтобы вывести содержимое, используйте print_r, var_dump, implode(', ', $arr) или json_encode($arr).
Что делает var_export в PHP?
Выводит значение как корректный PHP-код, например array ( 0 => 'a', ), который можно вставить обратно в скрипт. С true вторым аргументом функция возвращает код строкой, и так некоторые инструменты пишут кешированные файлы настроек.