Comment produire (dans un journal) un tableau à plusieurs niveaux dans un format lisible par l'homme?

91

Je travaille sur un site drupal et lors du débogage, je dois toujours lire de longs tableaux imbriqués. En conséquence, une grande partie de ma vie est passée à utiliser les touches fléchées, de retour et de tabulation, pour diviser plus de 1000 chaînes de caractères dans un format imbriqué et lisible.

Pour les développeurs drupal, je ne peux pas utiliser le dsm () de devel, car je travaille avec des formulaires multi-étapes # ahah / # ajax, et je ne peux afficher les tableaux que dans le journal des erreurs, pas à l'écran.

Exemple visuel:

Mal:

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

Bien:

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

Edit : Désolé, par "ne pas afficher à l'écran", je voulais dire via les messages système de drupal où il est possible de générer des tableaux dans un format cliquable et imbriqué (en utilisant devel.module).

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

Réponses:

203

Si vous devez enregistrer une erreur dans le journal des erreurs Apache, vous pouvez essayer ceci:

error_log( print_r($multidimensionalarray, TRUE) );
Akhilraj NS
la source
3
On dirait que c'est print_r(minuscule). Ça print_Rmarche vraiment aussi?
evanrmurphy
merci @AkhilrajNS pouvez-vous m'en dire plus sur comment puis-je envoyer la requête insérée ou toute requête exécutée au-dessus de ce message de journal.?
ankit suthar
@ankitsuthar Vouliez-vous dire Requête SQL?
Akhilraj NS
Oui, mais je l'ai obtenu par la dernière fonction de requête dans CI. En fait, je veux enregistrer des données qui sont insérées ou modifiées, supprimées.
ankit suthar
C'est dum. Cela génère des caractères de nouvelle ligne comme littéraux \nau lieu de nouvelles lignes réelles.
Otheus
23

http://php.net/manual/en/function.print-r.php Cette fonction peut être utilisée pour formater la sortie,

$output = print_r($array,1);

$outputest une variable de chaîne, elle peut être enregistrée comme toute autre chaîne. En php pur, vous pouvez utilisertrigger_error

Ex. trigger_error($output);

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

si vous avez besoin de le formater également en html, vous pouvez utiliser la <pre>balise

Fivell
la source
1
Lisez la question - OP doit le faire pour la sortie du journal - pas la sortie de l'écran.
Matt
@Matt a lu la réponse,if you need to format it also in html
code-jaff
@Fivell, j'essaye. Si vous clarifiez votre réponse pour expliquer que la sortie peut être envoyée dans le fichier journal, je supprimerai mon -1.
Matt
1
@Fivell il y a un petit problème avec la trigger_errorlimitation des messages à une longueur maximale de 1024 ou quelque chose de similaire. Rendre des chaînes plus longues var_exports/ plus print_rcoupées. C'est utile pour les structures simples.
Mihai Stancu
7

Des trucs simples:

Utiliser print_r, var_dumpou var_exportdevrait le faire assez bien si vous regardez le résultat en mode vue-source et non en mode HTML ou comme @Joel Larson l'a dit si vous enveloppez tout dans une <pre>balise.

print_r est le meilleur pour la lisibilité mais il n'imprime pas les valeurs nulles / fausses.

var_dump est le meilleur pour vérifier les types de valeurs et de longueurs et les valeurs nulles / fausses.

var_exportest similaire à var_dumpmais il peut être utilisé pour obtenir la chaîne sauvegardée .

Le format renvoyé par l'un d'entre eux est correctement mis en retrait dans le code source et var_exportpeut être utilisé pour la journalisation car il peut être utilisé pour renvoyer la chaîne sauvegardée.

Trucs avancés:

Utilisez le plug-in xdebug pour PHP, cela imprime var_dumpdes chaînes au format HTML et non un format de vidage brut et vous permet également de fournir une fonction personnalisée que vous souhaitez utiliser pour le formatage.

Mihai Stancu
la source
2
Lire la réponse var_exportvous permet de renvoyer une chaîne.
Mihai Stancu
2

Le module Devel de Drupal a d'autres fonctions utiles, y compris celles qui peuvent imprimer des tableaux et des objets formatés dans des fichiers journaux. Consultez le guide sur http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Enregistre toute variable dans un fichier nommé «drupal_debug.txt» dans le répertoire temporaire du site. Toutes les sorties de cette fonction sont ajoutées au fichier journal, ce qui permet de voir facilement comment le contenu d'une variable change lorsque vous modifiez votre code.

Si vous utilisez Mac OS X, vous pouvez utiliser la console de journalisation pour surveiller le contenu du fichier journal.

Si vous utilisez une version de Linux, vous pouvez utiliser la commande «tail -f drupal_debug.txt» pour observer les données enregistrées dans le fichier.

nmc
la source
1

Cela vous aidera

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

ÉDITER

l'utilisation echo '<pre>';est inutile, mais var_export($var);fera ce que vous attendez.

code-jaff
la source
1
@Matt Lorsque ce paramètre est défini sur TRUE, print_r () renvoie les informations plutôt que de les imprimer.
code-jaff
0

Vous devriez pouvoir utiliser un var_dump () dans une balise pre. Sinon, vous pourriez envisager d'utiliser une bibliothèque comme dump_r.php: https://github.com/leeoniya/dump_r.php

Ma solution est incorrecte. OP recherchait une solution formatée avec des espaces à stocker dans un fichier journal.

Une solution pourrait être d'utiliser la mise en mémoire tampon de sortie avec var_dump, puis str_replace () tous les onglets avec des espaces pour le formater dans le fichier journal.

Joël Larson
la source
Lisez la question - OP doit le faire pour la sortie du journal - pas la sortie de l'écran.
Matt
J'ai lu la question. J'ai manqué ce dernier petit commentaire. Merci de me le faire savoir. Cette solution ne fonctionnera pas alors.
Joel Larson
0

Je me demande simplement pourquoi personne n'utilise ou ne recommande la façon dont je préfère déboguer un tableau:

error_log(json_encode($array));

À côté de mon navigateur, tailmon serveur se connecte à la console, par exemple.

tail -f /var/log/apache2/error.log
wittich
la source