¿Cómo generar (en un registro) una matriz de varios niveles en un formato legible por humanos?

91

Estoy trabajando en un sitio de Drupal y, al depurar, siempre tengo que leer matrices largas y anidadas. Como resultado, paso una gran parte de mi vida usando las teclas de flecha, retorno y tabulación para dividir más de 1000 cadenas de caracteres en un formato anidado y legible.

Para los desarrolladores de drupal, no puedo usar dsm () de devel, ya que estoy trabajando con formularios # ahah / # ajax de varios pasos, y solo puedo enviar las matrices al registro de errores, no a la pantalla.

Ejemplo visual:

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

Bueno:

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

Editar : Lo siento, por "no enviar a la pantalla", me refiero a los mensajes del sistema de drupal, donde es posible generar matrices en un formato anidado en el que se puede hacer clic (usando devel.module).

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

Respuestas:

203

Si necesita registrar un error en el registro de errores de Apache, puede intentar esto:

error_log( print_r($multidimensionalarray, TRUE) );
Akhilraj NS
fuente
3
Parece que está print_r(en minúsculas). ¿ print_RRealmente funciona también?
evanrmurphy
gracias @AkhilrajNS ¿puede decirme más sobre cómo puedo enviar la consulta insertada o cualquier consulta que se ejecute sobre este mensaje de registro?
ankit suthar
@ankitsuthar ¿Quiso decir SQL Query?
Akhilraj NS
Sí, pero lo obtuve con la última función de consulta en CI. En realidad, quiero registrar datos que se insertan, editan o eliminan.
ankit suthar
Esto es tonto. Esto genera caracteres de nueva línea como literales en \nlugar de líneas nuevas reales.
Otheus
23

http://php.net/manual/en/function.print-r.php Esta función se puede utilizar para formatear la salida,

$output = print_r($array,1);

$outputes una variable de cadena, se puede registrar como cualquier otra cadena. En php puro puedes usartrigger_error

Ex. trigger_error($output);

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

si necesita formatearlo también en html, puede usar la <pre>etiqueta

Fivell
fuente
1
Lea la pregunta: OP debe hacer esto para la salida de registro, no para la salida de pantalla.
Matt
@ Matt leyó la respuestaif you need to format it also in html
code-jaff
@ Fivell, lo intento. Si aclara su respuesta para explicar que la salida se puede enviar al archivo de registro, eliminaré mi -1.
Matt
1
@Fivell hay un pequeño problema con trigger_errorque limita los mensajes a una longitud máxima de 1024 o algo similar. Haciendo que algunas var_exports/ print_rcuerdas se corten. Es útil para estructuras simples.
Mihai Stancu
7

Cosas simples:

Usar print_r, var_dumpo var_exportdebería hacerlo bastante bien si observa el resultado en el modo de fuente de visualización, no en el modo HTML o como dijo @Joel Larson si envuelve todo en una <pre>etiqueta.

print_r es mejor para la legibilidad pero no imprime valores nulos / falsos.

var_dump es mejor para comprobar tipos de valores y longitudes y valores nulos / falsos.

var_exportes similar a, var_dumppero se puede usar para obtener la cadena volcada .

El formato devuelto por cualquiera de estos está sangrado correctamente en el código fuente y var_exportse puede utilizar para el registro, ya que se puede utilizar para devolver la cadena volcada.

Cosas avanzadas:

Utilice el complemento xdebug para PHP, que imprime los mensajes de correo electrónico var_dumpcomo cadenas con formato HTML, no como formato de volcado sin formato y también le permite proporcionar una función personalizada que desee utilizar para formatear.

Mihai Stancu
fuente
2
Leer la respuesta le var_exportpermite devolver una cadena.
Mihai Stancu
2

El módulo Devel de Drupal tiene otras funciones útiles, incluidas las que pueden imprimir matrices y objetos formateados en archivos de registro. Consulte la guía en http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Registra cualquier variable en un archivo llamado "drupal_debug.txt" en el directorio temporal del sitio. Toda la salida de esta función se adjunta al archivo de registro, lo que facilita ver cómo cambia el contenido de una variable a medida que modifica su código.

Si está usando Mac OS X, puede usar la Consola de registro para monitorear el contenido del archivo de registro.

Si está usando una versión de Linux, puede usar el comando “tail -f drupal_debug.txt” para ver los datos que se registran en el archivo.

nmc
fuente
1

Esto te ayudara

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

EDITAR

usar echo '<pre>';es inútil, pero var_export($var);hará lo que esperabas.

código-jaff
fuente
1
@Matt Cuando este parámetro se establece en TRUE, print_r () devolverá la información en lugar de imprimirla.
code-jaff
0

Debería poder usar un var_dump () dentro de una etiqueta previa. De lo contrario, podría considerar el uso de una biblioteca como dump_r.php: https://github.com/leeoniya/dump_r.php

Mi solución es incorrecta. OP estaba buscando una solución formateada con espacios para almacenar en un archivo de registro.

Una solución podría ser usar el búfer de salida con var_dump, luego str_replace () todas las pestañas con espacios para formatearlo en el archivo de registro.

Joel Larson
fuente
Lea la pregunta: OP debe hacer esto para la salida de registro, no para la salida de pantalla.
Matt
Leí la pregunta. Perdí ese último pequeño comentario. Gracias por hacérmelo saber. Esta solución no funcionará entonces.
Joel Larson
0

Me pregunto por qué nadie usa o recomienda la forma en que prefiero depurar una matriz:

error_log(json_encode($array));

Junto a mi navegador, tailmi servidor inicia sesión en la consola, por ejemplo.

tail -f /var/log/apache2/error.log
Wittich
fuente