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

Posted

技术标签:

【中文标题】如何以人类可读的格式输出(到日志)多级数组?【英文标题】:How to output (to a log) a multi-level array in a format that is human-readable? 【发布时间】:2012-08-06 18:22:32 【问题描述】:

我正在开发一个 drupal 站点,在调试时,我总是需要通读长的嵌套数组。因此,我一生中的大部分时间都花在使用箭头键、回车键和制表键上,将 1000 多个字符串拆分为嵌套的可读格式。

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

视觉示例:

邪恶:

array ( 'form_wrapper' => array ( '#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 ' => '', '通过' => '', ),
...

好:

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)输出数组。

【问题讨论】:

php echo '
'.print_r($array,1).''; ?>
                
              
                
            
        
    

            

 
             
            【参考方案1】: 
                

    
    

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

error_log( print_r($multidimensionalarray, TRUE) );

【讨论】:

看起来是print_r(小写)。 print_R 真的也有效吗? 谢谢@AkhilrajNS 你能告诉我更多关于如何发送插入的查询或在此日志消息上方执行的任何查询吗? @ankitsuthar 你是说 SQL 查询吗? 是的,但我是通过 CI 中的最后一个查询函数得到的。实际上,我想记录一个被插入或编辑、删除的数据。 这是哑巴。这会将换行符输出为文字 \n 而不是实际的换行符。【参考方案2】:

http://php.net/manual/en/function.print-r.php 这个函数可以用来格式化输出,

$output = print_r($array,1);

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

例如。 trigger_error($output);

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

如果还需要格式化成html,可以使用&lt;pre&gt;标签

【讨论】:

阅读问题 - OP 需要为日志输出执行此操作 - 而不是屏幕输出。 @Matt 阅读了答案,if you need to format it also in html @Fivell,我试试。如果您澄清您的答案以解释可以将输出发送到日志文件,我将删除我的 -1。 @Fivell trigger_error 有一个小问题,它将消息限制为最大 1024 长度或类似的长度。使一些更长的var_exports/print_r 字符串被切断。它对于简单的结构很有用。【参考方案3】:

简单的东西:

使用print_rvar_dumpvar_export 应该会做得很好,如果你在查看源模式而不是 HTML 模式下查看结果,或者正如@Joel Larson 所说,如果你将所有内容包装在&lt;pre&gt; 中标记。

print_r 最适合可读性,但它不会打印 null/false 值。

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

var_exportvar_dump 类似,但可用于获取转储字符串。

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

高级的东西:

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

【讨论】:

阅读答案var_export允许你返回一个字符串。【参考方案4】:

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

error_log(json_encode($array));

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

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

【讨论】:

【参考方案5】:

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

dd()

将任何变量记录到名为“drupal_debug.txt”的文件中 站点的临时目录。此函数的所有输出都附加到 日志文件,便于查看变量的内容 修改代码时进行更改。

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

如果您使用的是 Linux 风格,您可以使用命令“tail -f drupal_debug.txt”来观察记录到文件中的数据。

【讨论】:

【参考方案6】:

这对你有帮助

echo '&lt;pre&gt;';

$output = print_r($array,1);

echo '&lt;/pre&gt;';

编辑

使用echo '&lt;pre&gt;'; 是没用的,但var_export($var); 会做你期望的事情。

【讨论】:

@Matt 当此参数设置为 TRUE 时,print_r() 将返回信息而不是打印信息。【参考方案7】:

您应该能够在 pre 标记中使用 var_dump()。否则你可以考虑使用像 dump_r.php 这样的库:https://github.com/leeoniya/dump_r.php

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

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

【讨论】:

阅读问题 - OP 需要为日志输出执行此操作 - 而不是屏幕输出。 我确实读过这个问题。错过了最后的小评论。谢谢你让我知道。那么这个解决方案就行不通了。【参考方案8】:

语法

print_r(variable, return);

变量必需。指定要返回有关信息的变量

返回可选。当设置为 true 时,此函数将返回信息(不打印)。默认为假

示例

error_log( print_r(<array Variable>, TRUE) );

【讨论】:

以上是关于如何以人类可读的格式输出(到日志)多级数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何以 json 格式(双引号)漂亮地打印(人类可读的打印)Python dict? [复制]

格式化日期对象以显示人类可读的日期

如何有效地从 jupyter 或 colab 中的数据帧复制输出并以漂亮/可读的格式粘贴到 ***

如何使用人类可读的日期格式将BSON转换为JSON

如何将字符串时间戳更改为人类可读的日期格式? [复制]

Bash:以人类可读格式将 unix 时间四舍五入到最接近的分钟