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).

Mark Shiraldi
fonte
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) );
Akhilraj NS
fonte
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

Fivell
fonte
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.

Mihai Stancu
fonte
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.

nmc
fonte
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.

código
fonte
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.

Joel Larson
fonte
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
wittich
fonte