Come generare (in un registro) un array multilivello in un formato leggibile dall'uomo?


91

Sto lavorando su un sito drupal e durante il debug devo sempre leggere array lunghi e annidati. Di conseguenza, gran parte della mia vita viene spesa utilizzando i tasti freccia, ritorno e tabulazione, per dividere oltre 1000 stringhe di caratteri in un formato nidificato e leggibile.

Per gli sviluppatori drupal, non posso usare dsm () di devel, dato che sto lavorando con form multi-step # ahah / # ajax, e posso solo visualizzare gli array nel log degli errori, non sullo schermo.

Esempio visivo:

Il male:

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

Buona:

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

Modifica : Spiacenti, con "non output sullo schermo", intendevo tramite i messaggi di sistema di drupal dove è possibile produrre array in un formato cliccabile e annidato (usando devel.module).


1
<? php echo '<pre>' .print_r ($ array, 1). '</pre>'; ?>
Rufino il

Risposte:


203

Se hai bisogno di registrare un errore nel log degli errori di Apache puoi provare questo:

error_log( print_r($multidimensionalarray, TRUE) );

3
Sembra che sia print_r(minuscolo). Funziona print_Rdavvero anche tu?
evanrmurphy

grazie @AkhilrajNS puoi dirmi di più su come posso inviare la query inserita o qualsiasi query eseguita sopra questo messaggio di log.?
ankit suthar

@ankitsuthar Volevi dire SQL Query?
Akhilraj NS

Sì, ma l'ho ottenuto dall'ultima funzione di query in CI. In realtà, voglio registrare un dato che viene inserito o modificato, cancellato.
ankit suthar

Questo è dum. Questo restituisce i caratteri di nuova riga come letterali \nanziché come nuovi caratteri .
Otheus

23

http://php.net/manual/en/function.print-r.php Questa funzione può essere utilizzata per formattare l'output,

$output = print_r($array,1);

$outputè una variabile stringa, può essere registrata come ogni altra stringa. In puro php puoi usaretrigger_error

Ex. trigger_error($output);

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

se hai bisogno di formattarlo anche in html, puoi usare <pre>tag


1
Leggi la domanda: OP deve farlo per l'output del registro, non per l'output dello schermo.
Matt

@ Matt ha letto la risposta,if you need to format it also in html
code-jaff

@Fivell, ci provo. Se chiarisci la tua risposta per spiegare che l'output può essere inviato al file di log, rimuoverò il mio -1.
Matt

1
@Fivell c'è un piccolo problema con il trigger_errorlimite dei messaggi a una lunghezza massima di 1024 o qualcosa di simile. Fare un po 'di più var_exports/ le print_rcorde vengono tagliate. È utile per strutture semplici.
Mihai Stancu

7

Cose semplici:

Usando print_r, var_dumpo var_exportdovrebbe farlo abbastanza bene se guardi il risultato in modalità di visualizzazione sorgente non in modalità HTML o come ha detto @Joel Larson se racchiudi tutto in un <pre>tag.

print_r è il migliore per la leggibilità ma non stampa valori null / false.

var_dump è l'ideale per controllare tipi di valori e lunghezze e valori null / false.

var_exportè simile a var_dumpma può essere utilizzato per ottenere la stringa scaricata.

Il formato restituito da uno di questi è rientrato correttamente nel codice sorgente e var_export può essere utilizzato per la registrazione poiché può essere utilizzato per restituire la stringa di dumping.

Cose avanzate:

Usa il plug-in xdebug per PHP che stampa le var_dumpstringhe in formato HTML non come formato raw dump e ti permette anche di fornire una funzione personalizzata che vuoi usare per la formattazione.


2
Leggere la risposta var_exportti permette di restituire una stringa.
Mihai Stancu

2

Il modulo Development di Drupal ha altre funzioni utili, incluse quelle che possono stampare array e oggetti formattati nei file di log. Consulta la guida su http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Registra qualsiasi variabile in un file denominato "drupal_debug.txt" nella directory temporanea del sito. Tutto l'output di questa funzione viene aggiunto al file di registro, semplificando la visualizzazione di come cambia il contenuto di una variabile quando si modifica il codice.

Se utilizzi Mac OS X puoi utilizzare la console di registrazione per monitorare il contenuto del file di registro.

Se stai usando una versione di Linux puoi usare il comando "tail -f drupal_debug.txt" per guardare i dati che vengono registrati nel file.


1

Questo ti aiuterà

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

MODIFICARE

l'utilizzo echo '<pre>';è inutile, ma var_export($var);farà la cosa che ti aspetti.


1
@Matt Quando questo parametro è impostato su TRUE, print_r () restituirà le informazioni invece di stamparle.
code-jaff

0

Dovresti essere in grado di utilizzare var_dump () all'interno di un pre tag. Altrimenti potresti provare a usare una libreria come dump_r.php: https://github.com/leeoniya/dump_r.php

La mia soluzione non è corretta. OP stava cercando una soluzione formattata con spazi da memorizzare in un file di registro.

Una soluzione potrebbe essere quella di utilizzare il buffer di output con var_dump, quindi str_replace () tutte le schede con spazi per formattarlo nel file di registro.


Leggi la domanda: OP deve farlo per l'output del registro, non per l'output dello schermo.
Matt

Ho letto la domanda. Ho perso l'ultimo piccolo commento. Grazie per avermi fatto sapere. Questa soluzione non funzionerà allora.
Joel Larson

0

Mi chiedo solo perché nessuno usa o consiglia il modo in cui preferisco eseguire il debug di un array:

error_log(json_encode($array));

Accanto al mio browser accedo al tailmio server nella console es.

tail -f /var/log/apache2/error.log
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.