让 var_dump 看起来很漂亮

Posted

技术标签:

【中文标题】让 var_dump 看起来很漂亮【英文标题】:Make var_dump look pretty 【发布时间】:2013-11-17 22:44:02 【问题描述】:

我有一个简单的$_GET[] 查询变量集,用于在从数据库中提取查询时显示测试数据。

<?php if($_GET['test']): ?>
  <div id="test" style="padding: 24px; background: #fff; text-align: center;">  
    <table>
      <tr style="font-weight: bold;"><td>MLS</td></tr>
      <tr><td><?php echo KEY; ?></td></tr>
      <tr style="font-weight: bold;"><td>QUERY</td></tr>
      <tr><td><?php echo $data_q; ?></td></tr>
      <tr style="font-weight: bold;"><td>DATA</td></tr>
      <tr><td><?php var_dump($data); ?></td></tr>
    </table>    
</div>
<?php endif; ?>

当我执行var_dump 时,正如预期的那样,这个大数组字符串全部混合在一起。有没有办法至少为此添加换行符或以更具可读性的方式显示var_dump?我对 jQuery 关于在发布后处理字符串的建议持开放态度。

【问题讨论】:

是的。 echo '&lt;pre&gt;'; var_dump($data); echo '&lt;/pre&gt;'. 这是什么魔法?! 如何使用 var_masterpiece。 chrome.google.com/webstore/detail/varmasterpiece/… 最初提出问题时,我认为这不是在网上商店中。对于任何研究它的人来说都值得一试。 我想你只是想要print_r($data)。 php.net/manual/en/function.print-r.php 【参考方案1】:

我真的很喜欢var_export()。如果您喜欢可复制/粘贴的代码,请尝试:

echo '<pre>' . var_export($data, true) . '</pre>';

或者甚至像这样的颜色语法突出显示:

highlight_string("<?php\n\$data =\n" . var_export($data, true) . ";\n?>");

可复用功能:

function highlight_array($array, $name = 'var') 
    highlight_string("<?php\n\$$name =\n" . var_export($array, true) . ";\n?>");

您可以对print_r() 执行相同的操作。对于var_dump(),您只需添加&lt;pre&gt; 标签:

echo '<pre>';
var_dump($data);
echo '</pre>';

【讨论】:

请注意,echovar_exporthighlight_string 都是 php 函数,需要在 &lt;?php ?&gt; 块内。是的,即使 highlight_string 函数行内部有一个 对,外部也需要一对。 这个 var_dump 的较短变体:var_dump(highlight_string("&lt;?\n". var_export($data, true))); 不错!这非常有帮助:) 谢谢! 该死! 15 年我一直在使用 PHP,我现在才看到这个??? :D 这个答案的获胜者具体是highlight_string("&lt;?php\n\$data =\n" . var_export($data, true) . ";\n?&gt;");!!!【参考方案2】:

这是一个替代的、积极维护的开源var_dump 类固醇:

https://github.com/php-sage/sage

它适用于零设置,比 Xdebug 的 var_dump 和 symfony/var-dumper 更有用。

使用 Kint 即时绕过转储对象大小限制的示例:

     require 'sage.phar';
     +d( $variable ); // append `+` to the dump call

截图如下:

【讨论】:

【参考方案3】:

这是我为以一种很好的方式显示数组而制作的函数:

function nicevar($var,$title='')
    if(is_array($var))
        $table = '<table>';
        if($title)
            $table .= '<tr><th colspan="20">'.$title.'</th></tr>';
        
        foreach($var as $k => $v)
            $table .= '<tr>';
                $table .= '<td><b>'.$k.'</b></td>';
                $table .= '<td>';
                    if(is_array($v))
                        $table .= nicevar($v);
                    else
                        $table .=  $v;
                    
                $table .= '</td>';
            $table .= '</tr>';
        
        $table .= '</table>';
    else
        $table = $var;
    
    return $table;  

用法:

echo nicevar($_SESSION['debug'],'Structure of debug');

使用这个样式让它变得漂亮:

<style>
body 
        padding: 30px;


table 
    margin: 5px;

table, th, td 
  border: 1px solid black;
  border-collapse: collapse;

th 
    background-color: #9fff96;

th, td 
  padding: 2px;
  border-spacing: 2px;

</style>

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 不确定你要我做什么,因为代码是自我解释的,如果你只是复制粘贴到一个 php 文件中也可以工作。然而,这是我第一次在 *** 上发帖,如果我遗漏了任何明显的内容,请见谅。【参考方案4】:

使用预格式化的 html 元素

    echo '<pre>';
        var_dump($data);
    echo '</pre>';

【讨论】:

【参考方案5】:

我似乎没有足够的代表来关闭它作为重复,但如果其他人可以做到这一点,它就是一个。我在A more pretty/informative Var_dump alternative in PHP? 上发布了同样的内容,但为了节省时间,我也会在这里复制/粘贴:

我不得不在这里添加另一个答案,因为我真的不想完成其他解决方案中的步骤。它非常简单,不需要扩展、包含等,这是我更喜欢的。这非常简单而且非常快速。

首先对有问题的变量进行 json_encode:

echo json_encode($theResult);

将您在http://jsoneditoronline.org/ 获得的结果复制到 JSON 编辑器中,只需将其复制到左侧窗格中,单击复制 >,它就会以非常漂亮的树格式打印 JSON。

每个人都有自己的想法,但希望这可以帮助其他人有一个更好的选择! :)

【讨论】:

【参考方案6】:
function var_view($var)


    ini_set("highlight.keyword", "#a50000;  font-weight: bolder");
    ini_set("highlight.string", "#5825b6; font-weight: lighter; ");

    ob_start();
    highlight_string("<?php\n" . var_export($var, true) . "?>");
    $highlighted_output = ob_get_clean();

    $highlighted_output = str_replace( ["&lt;?php","?&gt;"] , '', $highlighted_output );

    echo $highlighted_output;
    die();

【讨论】:

【参考方案7】:

为此有一个 Symfony 包:https://symfony.com/doc/current/components/var_dumper.html。

【讨论】:

【参考方案8】:

如果它是“全部混合在一起”,您通常可以尝试“查看源代码”。有时,转储、消息和异常似乎只是一个长字符串,而事实证明根本不显示换行符。尤其是 XML 树。

另外,我曾经为此创建了一个名为InteractiveVarDump 的小工具。它当然有其局限性,但有时也非常方便。尽管它的设计考虑了 PHP 5。

【讨论】:

【参考方案9】:

我写了一个函数 (debug_display),它可以漂亮地打印、数组、对象和文​​件信息。

<?php
function debug_display($var,$show = false) 
    if($show)  $dis = 'block'; else  $dis = 'none'; 
    ob_start();
    echo '<div style="display:'.$dis.';text-align:left; direction:ltr;"><b>Idea Debug Method : </b>
        <pre>';
    if(is_bool($var)) 
        echo $var === TRUE ? 'Boolean(TRUE)' : 'Boolean(FALSE)';
    else 
        if(FALSE == empty($var) && $var !== NULL && $var != '0') 
            if(is_array($var)) 
                echo "Number of Indexes: " . count($var) . "\n";
                print_r($var);
             elseif(is_object($var)) 
                print_r($var);
             elseif(@is_file($var))
                $stat = stat($var);
                $perm = substr(sprintf('%o',$stat['mode']), -4);
                $accesstime = gmdate('Y/m/d H:i:s', $stat['atime']);
                $modification = gmdate('Y/m/d H:i:s', $stat['mtime']);
                $change = gmdate('Y/m/d H:i:s', $stat['ctime']);
                echo "
    file path : $var
    file size : $stat['size'] Byte
    device number : $stat['dev']
    permission : $perm
    last access time was : $accesstime
    last modified time was : $modification
    last change time was : $change
    ";
            elseif(is_string($var)) 
                print_r(htmlentities(str_replace("\t", '  ', $var)));
              else 
                print_r($var);
            
        else 
            echo 'Undefined';
        
    
    echo '</pre>
    </div>';
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    unset($output);

【讨论】:

【参考方案10】:

我对@AbraCadaver 的答案做了补充。 我已经包含了一个 javascript 脚本,它将删除 php 开始和结束标记。 我们将有干净更漂亮的垃圾场。

可能也是这样的人。

function dd($data)
  highlight_string("<?php\n " . var_export($data, true) . "?>");
  echo '<script>document.getElementsByTagName("code")[0].getElementsByTagName("span")[1].remove() ;document.getElementsByTagName("code")[0].getElementsByTagName("span")[document.getElementsByTagName("code")[0].getElementsByTagName("span").length - 1].remove() ; </script>';
  die();

之前的结果:

之后的结果:

现在我们没有php开始和结束标签

【讨论】:

【参考方案11】:

这是我拥有漂亮 var_dump 的函数。结合Xdebug,有助于更好地了解我们正在倾倒的内容。

我对 Xdebug 的显示进行了一些改进(在周围留出一些空间、值之间的分隔符、包装长变量等)。

调用该函数时,可以设置标题、背景、文字颜色来区分页面中所有的var_dump。

或者不;)

/**
 * Pretty var_dump 
 * Possibility to set a title, a background-color and a text color
 */ 
function dump($data, $title="", $background="#EEEEEE", $color="#000000")

    //=== Style  
    echo "  
    <style>
        /* Styling pre tag */
        pre 
            padding:10px 20px;
            white-space: pre-wrap;
            white-space: -moz-pre-wrap;
            white-space: -pre-wrap;
            white-space: -o-pre-wrap;
            word-wrap: break-word;
        

        /* ===========================
        == To use with XDEBUG 
        =========================== */
        /* Source file */
        pre small:nth-child(1) 
            font-weight: bold;
            font-size: 14px;
            color: #CC0000;
        
        pre small:nth-child(1)::after 
            content: '';
            position: relative;
            width: 100%;
            height: 20px;
            left: 0;
            display: block;
            clear: both;
        

        /* Separator */
        pre i::after
            content: '';
            position: relative;
            width: 100%;
            height: 15px;
            left: 0;
            display: block;
            clear: both;
            border-bottom: 1px solid grey;
          
    </style>
    ";

    //=== Content            
    echo "<pre style='background:$background; color:$color; padding:10px 20px; border:2px inset $color'>";
    echo    "<h2>$title</h2>";
            var_dump($data); 
    echo "</pre>";


【讨论】:

【参考方案12】:

你可以用这个debugVar()代替var_dump()

查看:https://github.com/E1NSER/php-debug-function

【讨论】:

【参考方案13】:

获得漂亮的 var_dump 的最佳和最简单的方法是使用 xDebug(任何 php 开发人员都必须拥有) Debian方式安装

在控制台中:apt-get install php-xdebug 之后,您应该打开 php.ini(取决于您使用的堆栈),因为它是 /etc/php/7.0/fpm/php.ini

搜索display_errors

设置相同 -> display_errors = On

在下面的同一个文件中检查html_errors,它也必须是On

保存退出

打开后/etc/php/7.0/fpm/conf.d/20-xdebug.ini

并添加到末尾: ``` xdebug.cli_color=1

``` 保存并退出。

可以在这里找到许多其他可用的 xdebug 选项和文档。

https://xdebug.org/docs/

祝你好运,玩得开心!!!

Result

【讨论】:

【参考方案14】:

试试xdebug php 扩展。

例子:

<?php var_dump($_SERVER); ?>

输出:

【讨论】:

请注意,xdebug 所做的不仅仅是漂亮的 var_dump :) 我曾经在做 var_dump 时看到过这样的情况,但现在我有 wampserver 2.5 和 php 5.5.12 我看到它没有格式化。我以前怎么能看到像你的照片,除了 wampserver 之外没有安装任何东西? 这绝对是非常性感的。不知道为什么这没有被标记为正确的解决方案,但您可以提供有关安装过程的更多详细信息。在 Windows 上,它只是 extension=php_xdebug.dll,而不是 zend_extension=/some/really/long/specific/path/xdebug.so【参考方案15】:

使用

echo nl2br(var_dump());

这应该工作^^

【讨论】:

var_dump 不返回任何内容,直接输出。

以上是关于让 var_dump 看起来很漂亮的主要内容,如果未能解决你的问题,请参考以下文章

Xdebug 不适用于 var_dump()

如何让 xdebug var_dump 显示完整的对象/数组

PHP 重新格式化var_dump/print_r打印的数组

SQL数组var_dump什么都没显示

php中的var_dump之类的函数

cakephp 将数组记录为 var_dump