Как вывести (в лог) многоуровневый массив в удобочитаемом формате?


94

Я работаю над сайтом drupal, и при отладке мне всегда приходится читать длинные вложенные массивы. В результате большая часть моей жизни потрачена на использование клавиш со стрелками, возврата и табуляции, чтобы разбить 1000+ символьных строк во вложенный читаемый формат.

Для разработчиков drupal я не могу использовать devel dsm (), поскольку я работаю с многоэтапными формами # ahah / # ajax, и я могу выводить массивы только в журнал ошибок, а не на экран.

Наглядный пример:

Зло:

array ('form_wrapper' => array ('#tree' => true, '#type' => 'fieldset', '#prefix' => '', '#suffix' => '', '#value' = > '', 'name' => array ('#type' => 'textfield', '#title' => NULL, '#size' => 60, '#maxlength' => 60, '#required' = > false, '#description' => NULL, '#attributes' => array ('placeholder' => 'Email',), '#post' => array ('form_wrapper' => array ('name' => '', 'pass' => '',),
...

Хороший:

array ( 
'form_wrapper' => array ( 
    '#tree' => true, 
    '#type' => 'fieldset', 
    '#prefix' => '<div>', 
    '#suffix' => '</div>', 
    '#value' => '', 
    'name' => array ( 
        '#type' => 'textfield', 
        '#title' => NULL, 
        '#size' => 60, 
        '#maxlength' => 60, 
        '#required' => false, 
        '#description' => NULL, 
        '#attributes' => array ( 
            'placeholder' => 'Email', 
        ), 

Изменить : извините, под «не выводить на экран» я имел в виду через системные сообщения drupal, где можно выводить массивы в интерактивном, вложенном формате (используя devel.module).


1
<? php echo '<pre>' .print_r ($ array, 1). '</pre>'; ?>
Руфинус

Ответы:


210

Если вам нужно записать ошибку в журнал ошибок Apache, вы можете попробовать следующее:

error_log( print_r($multidimensionalarray, TRUE) );

3
Похоже, это print_r(строчные буквы). print_RДействительно ли работает?
evanrmurphy

спасибо @AkhilrajNS, не могли бы вы рассказать мне больше о том, как я могу отправить вставленный запрос или любой запрос, который выполняется над этим сообщением журнала?
анкит сутар

@ankitsuthar Вы имели в виду SQL-запрос?
Akhilraj NS

Да, но я получил его последней функцией запроса в CI. На самом деле, я хочу регистрировать данные, которые вставляются, редактируются, удаляются.
анкит сутар

Это дурак. Это выводит символы новой строки как буквальные, \nа не фактические.
Otheus

22

http://php.net/manual/en/function.print-r.php Эту функцию можно использовать для форматирования вывода,

$output = print_r($array,1);

$outputявляется строковой переменной, ее можно регистрировать, как и любую другую строку. В чистом php вы можете использоватьtrigger_error

Ex. trigger_error($output);

http://php.net/manual/en/function.trigger-error.php

если вам нужно отформатировать его также в html, вы можете использовать <pre>тег


1
Прочтите вопрос - OP должен делать это для вывода журнала, а не вывода на экран.
Мэтт

@Matt прочитал ответ,if you need to format it also in html
code-jaff

@Fivell, я стараюсь. Если вы проясните свой ответ, чтобы объяснить, что вывод может быть отправлен в файл журнала, я удалю свой -1.
Мэтт

1
@Fivell есть небольшая проблема с тем, что trigger_errorон ограничивает сообщения максимальной длиной 1024 или чем-то подобным. Делаем некоторые длинные var_exports/ print_rобрезанные струны. Это полезно для простых конструкций.
Михай Станку

7

Простые вещи:

Использование print_r, var_dumpили var_exportдолжны делать это очень хорошо , если вы посмотрите на результат в режиме просмотра источника не находится в режиме HTML или как @Joel Ларсон сказал , что если вы обернуть все в <pre>теге.

print_r лучше всего подходит для удобочитаемости, но не выводит нулевые / ложные значения.

var_dump лучше всего подходит для проверки типов значений и длины, а также значений null / false.

var_exportпохож на, var_dumpно его можно использовать для получения сброшенной строки.

Формат, возвращаемый любым из них, имеет правильный отступ в исходном коде и var_exportможет использоваться для ведения журнала, поскольку его можно использовать для возврата сброшенной строки.

Продвинутые вещи:

Используйте плагин xdebug для PHP, который печатает var_dumps как строки в формате HTML, а не как формат необработанного дампа, а также позволяет вам предоставить пользовательскую функцию, которую вы хотите использовать для форматирования.


2
Прочитать ответ var_exportпозволяет вернуть строку.
Михай Станку

2

В модуле Devel Drupal есть и другие полезные функции, в том числе функции печати форматированных массивов и объектов в файлы журналов. См. Руководство по адресу http://ratatosk.net/drupal/tutorials/debugging-drupal.html

дд ()

Записывает любую переменную в файл с именем «drupal_debug.txt» во временном каталоге сайта. Все выходные данные этой функции добавляются в файл журнала, что позволяет легко увидеть, как содержимое переменной изменяется по мере изменения кода.

Если вы используете Mac OS X, вы можете использовать консоль ведения журнала для отслеживания содержимого файла журнала.

Если вы используете разновидность Linux, вы можете использовать команду «tail -f drupal_debug.txt» для просмотра данных, записываемых в файл.


1

Это поможет тебе

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

РЕДАКТИРОВАТЬ

использование echo '<pre>';бесполезно, но var_export($var);сделает то, чего вы ожидаете.


1
@Matt Если для этого параметра установлено значение TRUE, print_r () вернет информацию, а не распечатает ее.
code-jaff 09

0

Вы должны иметь возможность использовать var_dump () внутри тега pre. В противном случае вы можете изучить использование библиотеки, например dump_r.php: https://github.com/leeoniya/dump_r.php

Мое решение неверное. OP искал решение, отформатированное с пробелами для хранения в файле журнала.

Решением может быть использование буферизации вывода с помощью var_dump, а затем str_replace () всех вкладок с пробелами для форматирования в файле журнала.


Прочтите вопрос - OP должен делать это для вывода журнала, а не вывода на экран.
Мэтт

Я прочитал вопрос. Пропустил последний небольшой комментарий. Спасибо, что дали мне знать. Тогда это решение не сработает.
Джоэл Ларсон,

0

Мне просто интересно, почему никто не использует и не рекомендует способ, которым я предпочитаю отлаживать массив:

error_log(json_encode($array));

Рядом с моим браузером я tailрегистрирую свой сервер в консоли, например.

tail -f /var/log/apache2/error.log

0

Синтаксис

print_r(variable, return);

переменная Обязательно . Задает переменную для возврата информации о

return Необязательно . Если установлено значение true, эта функция будет возвращать информацию (а не печатать ее). По умолчанию false

пример

error_log( print_r(<array Variable>, TRUE) );
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.