Wie kann ein mehrstufiges Array (in einem Protokoll) in einem für Menschen lesbaren Format ausgegeben werden?

91

Ich arbeite an einer Drupal-Site und muss beim Debuggen immer lange, verschachtelte Arrays durchlesen. Infolgedessen wird ein großer Teil meines Lebens mit den Pfeiltasten, der Eingabetaste und den Tabulatortasten verbracht, um mehr als 1000 Zeichenfolgen in ein verschachteltes, lesbares Format aufzuteilen.

Für Drupal-Entwickler kann ich dsm () von devel nicht verwenden, da ich mit mehrstufigen # ahah / # ajax-Formularen arbeite und die Arrays nur im Fehlerprotokoll und nicht auf dem Bildschirm ausgeben kann.

Visuelles Beispiel:

Böse:

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

Gut:

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

Bearbeiten : Entschuldigung, mit "nicht auf dem Bildschirm ausgeben" meinte ich über die Systemmeldungen von drupal, wo es möglich ist, Arrays in einem anklickbaren, verschachtelten Format (unter Verwendung von devel.module) auszugeben.

Mark Shiraldi
quelle
1
<? php echo '<pre>' .print_r ($ array, 1). '</ pre>'; ?>
Rufinus

Antworten:

202

Wenn Sie einen Fehler im Apache-Fehlerprotokoll protokollieren müssen, können Sie Folgendes versuchen:

error_log( print_r($multidimensionalarray, TRUE) );
Akhilraj NS
quelle
3
Sieht aus wie es ist print_r(Kleinbuchstaben). Funktioniert das auch print_Rwirklich?
evanrmurphy
danke @AkhilrajNS Können Sie mir mehr darüber erzählen, wie ich die eingefügte Abfrage oder eine Abfrage senden kann, die über dieser Protokollnachricht ausgeführt wird?
Ankit Suthar
@ankitsuthar Meinten Sie SQL Query?
Akhilraj NS
Ja, aber ich habe es durch die letzte Abfragefunktion in CI erhalten. Eigentlich möchte ich Daten protokollieren, die eingefügt oder bearbeitet, gelöscht werden.
Ankit Suthar
Das ist dumm. Dies gibt Zeilenumbruchzeichen als Literal \nanstelle von tatsächlichen Zeilenumbrüchen aus.
Otheus
23

http://php.net/manual/en/function.print-r.php Diese Funktion kann zum Formatieren der Ausgabe verwendet werden.

$output = print_r($array,1);

$outputist eine Zeichenfolgenvariable und kann wie jede andere Zeichenfolge protokolliert werden. In reinem PHP können Sie verwendentrigger_error

Ex. trigger_error($output);

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

Wenn Sie es auch in HTML formatieren müssen, können Sie <pre>Tag verwenden

Fivell
quelle
1
Lesen Sie die Frage - OP muss dies für die Protokollausgabe tun - nicht für die Bildschirmausgabe.
Matt
@ Matt las die Antwort,if you need to format it also in html
Code-Jaff
@Fivell, ich versuche es. Wenn Sie Ihre Antwort klarstellen, um zu erklären, dass die Ausgabe an die Protokolldatei gesendet werden kann, entferne ich meine -1.
Matt
1
@Fivell gibt es ein kleines Problem mit trigger_error dass Nachrichten auf maximal 1024 Länge oder ähnliches begrenzt werden. Länger machen var_exports/ print_rSaiten werden abgeschnitten. Es ist nützlich für einfache Strukturen.
Mihai Stancu
7

Einfaches Zeug:

Mit print_r, var_dumpoder var_exportsollte es tun ziemlich gut , wenn Sie in view-source - Modus nicht im HTML - Modus auf dem Ergebnis aussehen oder wie @ Joel Larson sagte , wenn Sie alles in einem Wrap - <pre>Tag.

print_r ist am besten für die Lesbarkeit geeignet, gibt jedoch keine Null- / Falschwerte aus.

var_dump eignet sich am besten zum Überprüfen von Wertetypen und -längen sowie von Null- / Falschwerten.

var_exportist ähnlich wie, var_dumpaber es kann verwendet werden, um die gedumpte Zeichenfolge zu erhalten.

Das von diesen zurückgegebene Format wird im Quellcode korrekt eingerückt und var_exportkann für die Protokollierung verwendet werden, da es zum Zurückgeben der ausgegebenen Zeichenfolge verwendet werden kann.

Fortgeschrittene Sachen:

Verwenden Sie das xdebug-Plug-In für PHP, das var_dumpals HTML-formatierte Zeichenfolgen und nicht als Raw-Dump-Format gedruckt wird. Außerdem können Sie eine benutzerdefinierte Funktion bereitstellen, die Sie für die Formatierung verwenden möchten.

Mihai Stancu
quelle
2
Wenn Sie die Antwort lesen, var_exportkönnen Sie eine Zeichenfolge zurückgeben.
Mihai Stancu
2

Das Devel-Modul von Drupal bietet weitere nützliche Funktionen, darunter solche, mit denen formatierte Arrays und Objekte in Protokolldateien gedruckt werden können. Siehe den Leitfaden unter http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Protokolliert jede Variable in einer Datei mit dem Namen "drupal_debug.txt" im temporären Verzeichnis der Site. Alle Ausgaben dieser Funktion werden an die Protokolldatei angehängt, sodass Sie leicht sehen können, wie sich der Inhalt einer Variablen ändert, wenn Sie Ihren Code ändern.

Wenn Sie Mac OS X verwenden, können Sie den Inhalt der Protokolldatei mithilfe der Protokollierungskonsole überwachen.

Wenn Sie eine Linux-Version verwenden, können Sie den Befehl "tail -f drupal_debug.txt" verwenden, um die in der Datei protokollierten Daten zu überwachen.

nmc
quelle
1

Das wird dir helfen

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

BEARBEITEN

Verwenden echo '<pre>';ist nutzlos, wird aber var_export($var);das tun, was Sie erwarten.

Code-Jaff
quelle
1
@Matt Wenn dieser Parameter auf TRUE gesetzt ist, gibt print_r () die Informationen zurück, anstatt sie zu drucken.
Code-Jaff
0

Sie sollten in der Lage sein, var_dump () innerhalb eines Pre-Tags zu verwenden. Andernfalls könnten Sie eine Bibliothek wie dump_r.php verwenden: https://github.com/leeoniya/dump_r.php

Meine Lösung ist falsch. OP suchte nach einer Lösung, die mit Leerzeichen zum Speichern in einer Protokolldatei formatiert ist.

Eine Lösung könnte darin bestehen, die Ausgabepufferung mit var_dump zu verwenden und dann alle Registerkarten mit Leerzeichen str_replace () zu verwenden, um sie in der Protokolldatei zu formatieren.

Joel Larson
quelle
Lesen Sie die Frage - OP muss dies für die Protokollausgabe tun - nicht für die Bildschirmausgabe.
Matt
Ich habe die Frage gelesen. Verpasste diesen letzten kleinen Kommentar. Danke für die Information. Diese Lösung wird dann nicht funktionieren.
Joel Larson
0

Ich frage mich nur, warum niemand die Art und Weise verwendet oder empfiehlt, wie ich ein Array lieber debugge:

error_log(json_encode($array));

Neben meinem Browser logge ich tailmeinen Server in der Konsole ein, z.

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