Jak wyprowadzić (do dziennika) wielopoziomową tablicę w formacie czytelnym dla człowieka?

94

Pracuję na stronie drupal i podczas debugowania zawsze muszę czytać długie, zagnieżdżone tablice. W rezultacie dużą część mojego życia spędzam przy użyciu klawiszy strzałek, powrotu i tabulacji, aby podzielić ponad 1000 ciągów znaków w zagnieżdżony, czytelny format.

W przypadku programistów drupal nie mogę używać dsm () od devel, ponieważ pracuję z wieloetapowymi formularzami # ahah / # ajax i mogę wysyłać tablice tylko do dziennika błędów, a nie na ekran.

Przykład wizualny:

Zło:

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' => '',),
...

Dobry:

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', 
        ), 

Edycja : Przepraszam, przez "nie wyświetlaj na ekranie", miałem na myśli komunikaty systemowe drupala, w których możliwe jest wysyłanie tablic w klikalnym, zagnieżdżonym formacie (używając devel.module).

Mark Shiraldi
źródło
1
<? php echo '<pre>' .print_r ($ tablica, 1). '</pre>'; ?>
Rufinus,

Odpowiedzi:

210

Jeśli chcesz zarejestrować błąd w dzienniku błędów Apache, możesz spróbować tego:

error_log( print_r($multidimensionalarray, TRUE) );
Akhilraj NS
źródło
3
Wygląda na to print_r(małe litery). Czy print_Rnaprawdę działa również?
evanrmurphy
dzięki @AkhilrajNS czy możesz mi powiedzieć więcej o tym, jak mogę wysłać wstawione zapytanie lub jakiekolwiek zapytanie, które jest wykonywane nad tym komunikatem dziennika.?
ankit suthar
@ankitsuthar Czy chodziło Ci o zapytanie SQL?
Akhilraj NS
Tak, ale dostałem to przez ostatnią funkcję zapytania w CI. Właściwie chcę rejestrować dane, które są wstawiane, edytowane, usuwane.
ankit suthar
To jest dum. Spowoduje to wyświetlenie znaków nowej linii jako literałów \nzamiast rzeczywistych znaków nowej linii.
Otheus
22

http://php.net/manual/en/function.print-r.php Ta funkcja może być używana do formatowania danych wyjściowych,

$output = print_r($array,1);

$outputjest zmienną łańcuchową, można ją rejestrować jak każdy inny ciąg. W czystym php możesz użyćtrigger_error

Dawny. trigger_error($output);

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

jeśli chcesz sformatować go również w html, możesz użyć <pre>tagu

Fivell
źródło
1
Przeczytaj pytanie - OP musi to zrobić dla wyjścia dziennika, a nie wyjścia ekranu.
Matt
@Matt przeczytaj odpowiedź,if you need to format it also in html
code-jaff
@Fivell, próbuję. Jeśli wyjaśnisz swoją odpowiedź, aby wyjaśnić, że dane wyjściowe można wysłać do pliku dziennika, usunę moje -1.
Matt
1
@Fivell jest mały problem z trigger_errortym, że ogranicza wiadomości do maksymalnej długości 1024 lub czegoś podobnego. Ucinanie dłuższych var_exports/ print_rsznurków. Jest to przydatne w przypadku prostych konstrukcji.
Mihai Stancu,
7

Proste rzeczy:

Korzystanie print_r, var_dumpczy var_exportpowinien zrobić to całkiem ładnie, jeśli spojrzeć na wynik w trybie view-source nie w trybie HTML lub jako @Joel Larson powiedział, że jeśli zawinąć wszystko w <pre>tagu.

print_r jest najlepszy ze względu na czytelność, ale nie wyświetla wartości null / false.

var_dump jest najlepsza do sprawdzania typów wartości i długości oraz wartości null / false.

var_exportjest podobny do, var_dumpale można go użyć do pobrania zrzuconego ciągu.

Format zwracany przez którykolwiek z nich jest poprawnie wcięty w kodzie źródłowym i var_exportmoże być używany do rejestrowania, ponieważ może służyć do zwracania zrzuconego ciągu.

Zaawansowane rzeczy:

Użyj wtyczki xdebug dla PHP, która drukuje var_dumpjako ciągi w formacie HTML, a nie jako surowy format zrzutu, a także pozwala na dostarczenie niestandardowej funkcji, której chcesz użyć do formatowania.

Mihai Stancu
źródło
2
Przeczytaj odpowiedź var_exportpozwala zwrócić ciąg.
Mihai Stancu
2

Moduł Devel w Drupalu ma inne przydatne funkcje, w tym te, które mogą drukować sformatowane tablice i obiekty do plików dziennika. Zobacz przewodnik pod adresem http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Rejestruje każdą zmienną w pliku o nazwie „drupal_debug.txt” w katalogu tymczasowym witryny. Wszystkie dane wyjściowe tej funkcji są dołączane do pliku dziennika, dzięki czemu można łatwo zobaczyć, jak zmienia się zawartość zmiennej podczas modyfikowania kodu.

Jeśli używasz Mac OS X, możesz użyć Konsoli rejestrowania do monitorowania zawartości pliku dziennika.

Jeśli używasz odmiany Linuksa, możesz użyć polecenia „tail -f drupal_debug.txt”, aby obserwować, jak dane są rejestrowane w pliku.

nmc
źródło
1

To ci pomoże

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

EDYTOWAĆ

używanie echo '<pre>';jest bezużyteczne, ale var_export($var);zrobi to, czego oczekujesz.

code-jaff
źródło
1
@Matt Gdy ten parametr jest ustawiony na TRUE, print_r () zwróci informacje, a nie wydrukuje je.
code-jaff
0

Powinno być możliwe użycie var_dump () w tagu wstępnym. W przeciwnym razie możesz skorzystać z biblioteki takiej jak dump_r.php: https://github.com/leeoniya/dump_r.php

Moje rozwiązanie jest nieprawidłowe. OP szukał rozwiązania sformatowanego ze spacjami do przechowywania w pliku dziennika.

Rozwiązaniem może być użycie buforowania danych wyjściowych za pomocą var_dump, a następnie str_replace () wszystkich kart ze spacjami, aby sformatować je w pliku dziennika.

Joel Larson
źródło
Przeczytaj pytanie - OP musi to zrobić dla wyjścia dziennika, a nie wyjścia ekranu.
Matt
Przeczytałem pytanie. Przegapiłem ten ostatni mały komentarz. Dzięki, że dałeś mi znać. To rozwiązanie wtedy nie zadziała.
Joel Larson
0

Zastanawiam się tylko, dlaczego nikt nie używa ani nie zaleca sposobu, w jaki wolę debugować tablicę:

error_log(json_encode($array));

Obok mojej przeglądarki tailmój serwer loguję się do konsoli np.

tail -f /var/log/apache2/error.log
wittich
źródło
0

Składnia

print_r(variable, return);

zmienna Wymagana . Określa zmienną, o której mają zostać zwrócone informacje

powrót Opcjonalne . Gdy jest ustawiona na true, ta funkcja zwróci informacje (nie wydrukuje ich). Wartość domyślna to false

Przykład

error_log( print_r(<array Variable>, TRUE) );
Nikunj K.
źródło