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


91

我在一个drupal网站上工作,并且在调试时,我总是必须通读嵌套的长数组。结果,我一生的大部分时间都花在使用箭头,回车键和Tab键上,将1000多个字符串拆分成嵌套的可读格式。

对于drupal开发人员,我无法使用devel的dsm(),因为我正在使用多步骤#ahah /#ajax表单,因此我只能将数组输出到错误日志,而不是屏幕。

视觉示例:

邪恶:

数组('form_wrapper'=>数组('#tree'=> true,'#type'=>'fieldset','#prefix'=>``,'#suffix'=>'','#value'= >'','名称'=>数组('#type'=>'textfield','#title'=> NULL,'#size'=> 60,'#maxlength'=> 60,'#required'= > false,'#description'=> NULL,'#attributes'=>数组('placeholder'=>'Email',),'#post'=>数组('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', 
        ), 

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


1
<?php echo'<pre>'。print_r($ array,1)。'</ pre>'; ?
鲁菲努斯(Rufinus)

Answers:


203

如果您需要将错误记录到Apache错误日志中,可以尝试以下操作:

error_log( print_r($multidimensionalarray, TRUE) );

3
看起来像是print_r(小写)。是否print_R真的有效呢?
evanrmurphy '16

谢谢@AkhilrajNS您能告诉我更多有关如何发送插入的查询或在此日志消息上方执行的查询的信息吗?
ankit suthar

@ankitsuthar您的意思是SQL查询吗?
Akhilraj NS'17年

是的,但是我是通过CI中的最后一个查询功能得到的。实际上,我想记录插入或编辑,删除的数据。
ankit suthar

这太蠢了。这会将换行符输出为文字\n而不是实际的换行符。
Otheus

23

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

$output = print_r($array,1);

$output是一个字符串变量,可以像其他所有字符串一样记录。在纯PHP中,您可以使用trigger_error

例如 trigger_error($output);

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

如果您还需要在html中设置其格式,则可以使用<pre>标签


1
阅读问题-OP需要为日志输出执行此操作-而不是屏幕输出。
马特

@马特读了答案,if you need to format it also in html
code-jaff

@Fivell,我尝试。如果您澄清答案以解释输出可以发送到日志文件,我将删除-1。
马特

1
@Fivell有一个小问题,trigger_error它将消息的最大长度限制为1024或类似的长度。使一些更长的var_exports/ print_r字符串被切断。对于简单的结构很有用。
Mihai Stancu,2012年

7

简单的东西:

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

print_r 最好的可读性,但它不显示null / false值。

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

var_export与之相似,var_dump但可用于获取转储的字符串。

这些格式中的任何一个返回的格式都已在源代码中正确缩进,并且var_export可用于记录日志,因为它可用于返回转储的字符串。

高级内容:

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


2
阅读答案var_export可以让您返回字符串。
Mihai Stancu,2012年

2

Drupal的Devel模块还有其他有用的功能,包括可以将格式化的数组和对象打印到日志文件的功能。请参阅以下指南:http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd()

将任何变量记录到站点的temp目录中名为“ drupal_debug.txt”的文件中。该函数的所有输出都将附加到日志文件中,使您可以轻松查看变量内容在修改代码时的变化。

如果您使用的是Mac OS X,则可以使用Logging Console监视日志文件的内容。

如果您使用的是Linux,则可以使用命令“ tail -f drupal_debug.txt”来查看正在记录到文件中的数据。


1

这对你有帮助

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

编辑

使用echo '<pre>';是没有用的,但是var_export($var);会做您期望的事情。


1
@Matt当此参数设置为TRUE时,print_r()将返回信息而不是打印信息。
code-jaff 2012年

0

您应该能够在pre标签内使用var_dump()。否则,您可以考虑使用类似dump_r.php的库:https : //github.com/leeoniya/dump_r.php

我的解决方案不正确。OP正在寻找一种使用空格格式化以存储在日志文件中的解决方案。

一种解决方案可能是将输出缓冲与var_dump一起使用,然后str_replace()所有带有空格的选项卡在日志文件中对其进行格式化。


阅读问题-OP需要为日志输出执行此操作-而不是屏幕输出。
马特

我确实读过这个问题。错过了最后一点评论。谢谢你让我知道。这样,该解决方案将无法工作。
乔尔·拉尔森

0

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

error_log(json_encode($array));

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

tail -f /var/log/apache2/error.log
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.