Como produzir (em um log) uma matriz de vários níveis em um formato legível por humanos?


91

Estou trabalhando em um site drupal e, durante a depuração, sempre tenho que ler matrizes longas e aninhadas. Como resultado, uma grande parte da minha vida é gasta usando as teclas de seta, retorno e tab para dividir mais de 1000 strings de caracteres em um formato aninhado e legível.

Para devs drupal, não posso usar o dsm () de devel, pois estou trabalhando com formulários # ahah / # ajax de várias etapas e só posso enviar os arrays para o log de erros, não para a tela.

Exemplo 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 ('nome' => '', 'pass' => '',),
...

Boa:

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 : Desculpe, por "não saída para a tela", eu quis dizer via mensagens de sistema do drupal onde é possível gerar matrizes em um formato aninhado clicável (usando devel.module).


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

Respostas:


203

Se você precisar registrar um erro no log de erros do Apache, tente o seguinte:

error_log( print_r($multidimensionalarray, TRUE) );

3
Parece que está print_r(minúsculas). Será que print_Rrealmente funciona bem?
— evanrmurphy

obrigado @AkhilrajNS você pode me dizer mais sobre como posso enviar a consulta inserida ou qualquer consulta que é executada acima desta mensagem de log.?
— ankit suthar

@ankitsuthar Você quis dizer SQL Query?
— Akhilraj NS de

Sim, mas entendi pela última função de consulta em CI. Na verdade, eu quero registrar dados que são inseridos ou editados, excluídos.
— ankit suthar de

Isso é dum. Isso gera caracteres de nova linha como literais em \nvez de novas linhas reais.
— Otheus

23

http://php.net/manual/en/function.print-r.php Esta função pode ser usada para formatar a saída,

$output = print_r($array,1);

$outputé uma variável de string, pode ser registrada como qualquer outra string. Em php puro, você pode usartrigger_error

Ex. trigger_error($output);

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

se precisar formatá-lo também em html, você pode usar <pre>tag


1
Leia a pergunta - OP precisa fazer isso para a saída do log - não para a saída da tela.
— Matt

@Matt leu a resposta,if you need to format it also in html
— code-jaff

@Fivell, eu tento. Se você esclarecer sua resposta para explicar que a saída pode ser enviada para o arquivo de log, removerei meu -1.
— Matt

1
@Fivell, há um pequeno problema com trigger_errorele limita as mensagens a um comprimento máximo de 1024 ou algo semelhante. Fazendo com que algumas cordas var_exports/ mais longas print_rsejam cortadas. É útil para estruturas simples.
— Mihai Stancu

7

Coisas simples:

Usar print_r, var_dumpou var_exportdeve funcionar muito bem se você olhar para o resultado no modo view-source e não no modo HTML ou como @Joel Larson disse se você envolver tudo em uma <pre>tag.

print_r é melhor para legibilidade, mas não imprime valores nulos / falsos.

var_dump é melhor para verificar tipos de valores e comprimentos e valores nulos / falsos.

var_exporté semelhante, var_dumpmas pode ser usado para obter a string despejada.

O formato retornado por qualquer um deles é recuado corretamente no código-fonte e var_exportpode ser usado para registro, pois pode ser usado para retornar a string despejada.

Coisas avançadas:

Use o plug-in xdebug para PHP, que imprime var_dumps como strings formatadas em HTML, não como formato de dump bruto e também permite fornecer uma função personalizada que deseja usar para formatação.


2
Ler a resposta var_exportpermite que você retorne uma string.
— Mihai Stancu

2

O módulo Develop do Drupal possui outras funções úteis, incluindo aquelas que podem imprimir arrays formatados e objetos em arquivos de log. Consulte o guia em http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Registra qualquer variável em um arquivo denominado “drupal_debug.txt” no diretório temporário do site. Toda a saída dessa função é anexada ao arquivo de log, tornando fácil ver como o conteúdo de uma variável muda conforme você modifica seu código.

Se estiver usando o Mac OS X, você pode usar o console de registro para monitorar o conteúdo do arquivo de registro.

Se estiver usando um tipo de Linux, você pode usar o comando “tail -f drupal_debug.txt” para observar os dados sendo registrados no arquivo.


1

Isso vai te ajudar

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

EDITAR

usar echo '<pre>';é inútil, mas var_export($var);fará o que você espera.


1
@Matt Quando este parâmetro é definido como TRUE, print_r () irá retornar a informação ao invés de imprimi-la.
— code-jaff de

0

Você deve ser capaz de usar um var_dump () dentro de uma tag pre. Caso contrário, você pode usar uma biblioteca como dump_r.php: https://github.com/leeoniya/dump_r.php

Minha solução está incorreta. OP estava procurando uma solução formatada com espaços para armazenar em um arquivo de log.

Uma solução pode ser usar o buffer de saída com var_dump, então str_replace () todas as guias com espaços para formatá-lo no arquivo de log.


Leia a pergunta - OP precisa fazer isso para a saída do log - não para a saída da tela.
— Matt

Eu li a pergunta. Perdi esse último pequeno comentário. Obrigado por me avisar. Essa solução não vai funcionar então.
— Joel Larson

0

Só me pergunto por que ninguém usa ou recomenda a maneira que prefiro depurar um array:

error_log(json_encode($array));

Ao lado do meu navegador, tailmeu servidor loga no console, por exemplo.

tail -f /var/log/apache2/error.log
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.