Як вивести (до журналу) багаторівневий масив у форматі, зручному для читання?


91

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

Для drupal-розробників я не можу використовувати devel's 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>'; ?>
Руфін

Відповіді:


203

Якщо вам потрібно зареєструвати помилку в журналі помилок Apache, ви можете спробувати це:

error_log( print_r($multidimensionalarray, TRUE) );

3
Схоже, це print_r(мала літера). Є чи на print_Rсамому ділі працює, а?
evanrmurphy

дякую @AkhilrajNS, чи можете ви сказати мені більше про те, як я можу надіслати вставлений запит або будь-який запит, який виконується над цим повідомленням журналу.?
ankit suthar

@ankitsuthar Ви мали на увазі запит SQL?
Akhilraj NS

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

Це дум. Це виводить символи нового рядка як буквальні \nзамість фактичних нових рядків.
Отей,

23

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

$output = print_r($array,1);

$outputє змінною рядка, її можна реєструвати, як і будь-яку іншу рядок. У чистому php ви можете використовуватиtrigger_error

Напр. trigger_error($output);

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

якщо вам потрібно відформатувати його також у форматі html, ви можете використовувати <pre>тег


1
Прочитайте запитання - OP повинен робити це для виведення журналу, а не для виведення на екран.
Matt

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

@Fivell, я намагаюся. Якщо ви поясните свою відповідь, щоб пояснити, що вихідні дані можна надіслати у файл журналу, я видалю свій -1.
Метт,

1
@Fivell є невелика проблема, trigger_errorяка обмежує повідомлення до 1024 довжини або щось подібне. Зробити деякі довші var_exports/ print_rрядки обрізаними. Це корисно для простих конструкцій.
Mihai Stancu

7

Прості речі:

Використання print_r, var_dumpабо var_exportповинні робити це дуже добре , якщо ви подивитеся на результат в режимі перегляду джерела не знаходиться в режимі HTML або як @Joel Ларсон сказав , що якщо ви обернути все в <pre>тезі.

print_r найкраще для читабельності, але не друкує значення null / false.

var_dump найкраще підходить для перевірки типів значень і довжин та нульових / помилкових значень.

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

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

Додаткові матеріали:

Використовуйте плагін xdebug для PHP, який друкує var_dumpяк рядки, відформатовані у форматі HTML, а не як вихідний формат дампа, а також дозволяє надати користувацьку функцію, яку ви хочете використовувати для форматування.


2
Прочитана відповідь var_exportдозволяє повернути рядок.
Mihai Stancu

2

Модуль Devel Drupal має інші корисні функції, включаючи функції друку відформатованих масивів та об'єктів у файлах журналів. Дивіться керівництво за адресою http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Будь-яка змінна реєструється у файлі “drupal_debug.txt” у тимчасовій директорії сайту. Всі вихідні дані цієї функції додаються до файлу журналу, що дозволяє легко побачити, як змінюється вміст змінної під час модифікації коду.

Якщо ви використовуєте Mac OS X, ви можете використовувати Logging Console для відстеження вмісту файлу журналу.

Якщо ви використовуєте аромат 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

0

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

Моє рішення неправильне. OP шукав рішення, відформатоване з пробілами для зберігання у файлі журналу.

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


Прочитайте запитання - OP повинен робити це для виведення журналу, а не для виведення на екран.
Matt

Я справді прочитав запитання. Пропустив останній маленький коментар. Дякую що дали мені знати. Тоді це рішення не спрацює.
Джоел Ларсон,

0

Мені просто цікаво, чому ніхто не використовує і не рекомендує спосіб, яким я віддаю перевагу налагоджувати масив:

error_log(json_encode($array));

Поряд із моїм браузером, я tailввійду на сервер у консоль, наприклад.

tail -f /var/log/apache2/error.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.