如何以人类可读的格式输出(到日志)多级数组?

Mar*_*ldi 84 php drupal

我正在研究一个drupal站点,在调试时,我总是要阅读长的嵌套数组.因此,我的大部分时间都花在使用箭头,返回和制表键上,将1000多个字符串拆分成嵌套的可读格式.

对于drupal devs,我不能使用devel的dsm(),因为我正在处理多步#ahah/#ajax表单,我只能将数组输出到错误日志,而不是屏幕.

视觉示例:

邪恶:

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

好:

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', 
        ), 
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,通过"不输出到屏幕",我的意思是通过drupal的系统消息,可以以可点击的嵌套格式输出数组(使用devel.module).

Akh*_*N S 180

如果您需要将错误记录到Apache错误日志,您可以尝试这样做:

error_log( print_r($multidimensionalarray, TRUE) );
Run Code Online (Sandbox Code Playgroud)

  • 看起来像是`print_r`(小写).`print_R`真的有效吗? (3认同)

Fiv*_*ell 24

http://php.net/manual/en/function.print-r.php 此函数可用于格式化输出,

$output = print_r($array,1);
Run Code Online (Sandbox Code Playgroud)

$output是一个字符串变量,它可以像其他每个字符串一样记录.在纯PHP中你可以使用trigger_error

防爆. trigger_error($output);

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

如果你还需要在html中格式化它,你可以使用<pre>标签


wit*_*ich 14

我只是想知道为什么没有人使用或推荐我喜欢的调试数组的方式:

error_log(json_encode($array));
Run Code Online (Sandbox Code Playgroud)

在我的浏览器旁边,tail我的服务器登录控制台,例如。

tail -f /var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)

虽然输出是否可读是有争议的,但它仍然是我阅读它的首选方式,并且看起来像这样:

[Tue Dec 13] [...] AH01071: Got error 'PHP message: {"form_wrapper":{"#tree":true,
"#type":"fieldset","#prefix":"","#suffix":"","#value":"","name":{"#type":
"textfield","#title":null,"#size":60,"#maxlength":60,"#required":false,
"#description":null,"#attributes":{"placeholder":"Email"},"#post":{
`"form_wrapper":{"name":"","pass":""}}}}}', referer: http://localhost/
Run Code Online (Sandbox Code Playgroud)

  • 因为它不是“人类可读的”:D 说真的,这是一个好主意。后处理器与“jq”相结合可以使其成为出色的调试工具 (2认同)

Mih*_*ncu 7

简单的东西:

使用print_r,var_dump或者var_export应该做的,如果你看看结果在查看源代码模式不是在HTML模式或@Joel拉尔森,如果你包裹在一切说的话是很好的<pre>标记.

print_r 最好是为了可读性,但它不会打印null/false值.

var_dump 最适合检查值和长度的类型以及null/false值.

var_export是simmilar var_dump但它可以用来获取转储的字符串.

任何这些返回的格式都在源代码中正确缩进,var_export可用于记录,因为它可用于返回转储的字符串.

高级的东西:

使用PHP的xdebug插件,它将var_dumpHTML 打印为HTML格式的字符串,而不是原始转储格式,还允许您提供要用于格式化的自定义函数.

  • 阅读答案 `var_export` 允许您返回一个字符串。 (3认同)