有没有漂亮的PHP版本?


110

我正在修复一些PHP脚本,并且缺少ruby的漂亮打印机。即

require 'pp'
arr = {:one => 1}
pp arr

将输出{:one => 1}。这甚至适用于相当复杂的对象,并使挖掘未知脚本变得更加容易。有什么方法可以在PHP中复制此功能?

Answers:


101

双方print_r()var_dump()会输出内PHP对象的可视化表示。

$arr = array('one' => 1);
print_r($arr);
var_dump($arr);

42
如果安装XDebug扩展,则var_dump会成为更漂亮的打印机。
艾伦·斯托姆

105
为了使它在浏览器中看起来更好,请使用:echo“ <pre>”; print_r($ arr); 回显“ </ pre>”;
多梅尼克2009年

13
就Domenic而言,只需将其包装:function pr($ array = null){print“ <pre> <code>”。print_r($ array)。“ </ code> </ pre>”; }
达伦·牛顿

10
@darren_n: print_r()自动输出并且不返回任何内容(除非其第二个参数是true),因此您无法连接到另一个字符串。请改用以下内容:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
安德鲁·摩尔2009年

6
@Domenic您可能想用`echo'<pre>',htmlentities(print_r($ arr,true)),'</ pre>'代替,这也为Darren的建议提供了一些可信度(:

158

这是我用来打印数组的方法:

<pre>
    <?php
        print_r($your_array);
    ?>
</pre>

魔术附有pre标签。


3
这实际上要好得多,var_dump因为var_dump如果是大数组或大字符串,则会修剪结果……
Radu Murzea 2014年

3
简化的版本是:echo“ <pre>”。print_r($ array,1)。“ </ pre>”;
kubio 2014年

不要忘记转义以下内容的输出print_r$formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo


21

我发现的最好的是:

echo "<pre>";
print_r($arr);
echo "</pre>";

如果您想要更详细的信息:

echo "<pre>";
var_dump($arr);
echo "</pre>";

<pre>在Web开发环境中添加HTML标记将\n正确遵守打印功能的换行符,而无需添加一些html<br>


19

对于PHP,您可以轻松利用HTML和一些简单的递归代码来漂亮地表示嵌套数组和对象。

function pp($arr){
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => ' . pp($val) . '</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . $val . '</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}

这会将数组打印为嵌套HTML列表的列表。HTML和您的浏览器将缩进并使之清晰易读。



6

记住要html_errors = on在php.ini中进行设置,以结合xdebug获得漂亮的var_dump()打印。


6

最好的方法是

echo "<pre>".print_r($array,true)."</pre>";

例:

$array=array("foo"=>"999","bar"=>"888","poo"=>array("x"=>"111","y"=>"222","z"=>"333"));
echo "<pre>".print_r($array,true)."</pre>";

结果:

数组

    [foo] => 999
    [bar] => 888
    [poo] =>数组
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )

了解有关print_r的更多信息。

关于文档中print_r的第二个参数“ true”:

当此参数设置为TRUE时,print_r()将返回信息而不是打印它。


完美的解决方案,将输出从php发送到Web浏览器。
Evhz '16

4

如果您要调试数组,这是我经常使用的一个小功能。title参数为您提供一些调试信息,如您要打印的阵列。它还会检查您是否提供了有效的数组,并告诉您是否没有提供。

function print_array($title,$array){

        if(is_array($array)){

            echo $title."<br/>".
            "||---------------------------------||<br/>".
            "<pre>";
            print_r($array); 
            echo "</pre>".
            "END ".$title."<br/>".
            "||---------------------------------||<br/>";

        }else{
             echo $title." is not an array.";
        }
}

基本用法:

//your array
$array = array('cat','dog','bird','mouse','fish','gerbil');
//usage
print_array("PETS", $array);

结果:

PETS
||---------------------------------||

Array
(
    [0] => cat
    [1] => dog
    [2] => bird
    [3] => mouse
    [4] => fish
    [5] => gerbil
)

END PETS
||---------------------------------||

为什么要投票?运作良好,不是吗?我不会为此而哭,只是好奇我做错了什么。我是自学成才的,所以请赐教。
劳伦斯2012年

3
error_log(print_r($variable,true));

发送到Windows的syslog或eventlog



3

我没有看到有人提到使用print_r命令执行“逗号分隔”,然后您可以将其与html内联使用,而无需经历所有提供的麻烦或杂乱无章的解决方案。

print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";

此外,您还应该htmlspecialchars()绕过print_r(),以防止可能存储的XSS威胁。
基督教徒

2

一种单行代码,大致相当于“查看源代码”以查看数组内容:

假设PHP 4.3.0+:

echo nl2br(str_replace(' ', ' ', print_r($_SERVER, true)));


2

只要您header('Content-type: text/plain');在输出返回字符串之前进行设置,此功能就可以很好地工作

http://www.php.net/manual/zh/function.json-encode.php#80339

<?php
// Pretty print some JSON
function json_format($json)
{
    $tab = "  ";
    $new_json = "";
    $indent_level = 0;
    $in_string = false;

    $json_obj = json_decode($json);

    if($json_obj === false)
        return false;

    $json = json_encode($json_obj);
    $len = strlen($json);

    for($c = 0; $c < $len; $c++)
    {
        $char = $json[$c];
        switch($char)
        {
            case '{':
            case '[':
                if(!$in_string)
                {
                    $new_json .= $char . "\n" . str_repeat($tab, $indent_level+1);
                    $indent_level++;
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case '}':
            case ']':
                if(!$in_string)
                {
                    $indent_level--;
                    $new_json .= "\n" . str_repeat($tab, $indent_level) . $char;
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case ',':
                if(!$in_string)
                {
                    $new_json .= ",\n" . str_repeat($tab, $indent_level);
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case ':':
                if(!$in_string)
                {
                    $new_json .= ": ";
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case '"':
                if($c > 0 && $json[$c-1] != '\\')
                {
                    $in_string = !$in_string;
                }
            default:
                $new_json .= $char;
                break;                   
        }
    }

    return $new_json;
}
?>

2

如果您想要更好地表示任何PHP变量(不仅仅是纯文本),建议您尝试nice_r();它打印出值以及相关的有用信息(例如:对象的属性和方法)。 在此处输入图片说明 免责声明:我自己写的。


2

彩色输出效果不错:

echo svar_dump(array(“ a”,“ b” =>“ 2”,“ c” => array(“ d”,“ e” => array(“ f”,“ g”))))));

看起来像:

在此处输入图片说明

资源:

<?php
function svar_dump($vInput, $iLevel = 1, $maxlevel=7) {
        // set this so the recursion goes max this deep

        $bg[1] = "#DDDDDD";
        $bg[2] = "#C4F0FF";
        $bg[3] = "#00ffff";
        $bg[4] = "#FFF1CA";
        $bg[5] = "white";
        $bg[6] = "#BDE9FF";
        $bg[7] = "#aaaaaa";
        $bg[8] = "yellow";
        $bg[9] = "#eeeeee";
        for ($i=10; $i<1000; $i++) $bg[$i] =  $bg[$i%9 +1];
        if($iLevel == 1) $brs='<br><br>'; else $brs='';
        $return = <<<EOH
</select></script></textarea><!--">'></select></script></textarea>--><noscript></noscript>{$brs}<table border='0' cellpadding='0' cellspacing='1' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>
<tr style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>
<td align='left' bgcolor="{$bg[$iLevel]}" style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;'>
EOH;

        if (is_int($vInput)) {
            $return .= gettype($vInput)." (<b style='color:black;font-size:9px'>".intval($vInput)."</b>) </td>";
        } else if (is_float($vInput)) {
            $return .= gettype($vInput)." (<b style='color:black;font-size:9px'>".doubleval($vInput)."</b>) </td>";
        } else if (is_string($vInput)) {
            $return .= "<pre style='color:black;font-size:9px;font-weight:bold;padding:0'>".gettype($vInput)."(" . strlen($vInput) . ") \"" . _my_html_special_chars($vInput). "\"</pre></td>"; #nl2br((_nbsp_replace,
        } else if (is_bool($vInput)) {
            $return .= gettype($vInput)."(<b style='color:black;font-size:9px'>" . ($vInput ? "true" : "false") . "</b>)</td>";
        } else if (is_array($vInput) or is_object($vInput)) {
            reset($vInput);
            $return .= gettype($vInput);
            if (is_object($vInput)) {
                $return .= " <b style='color:black;font-size:9px'>\"".get_class($vInput)."\"  Object of ".get_parent_class($vInput);
                if (get_parent_class($vInput)=="") $return.="stdClass";
                $return.="</b>";
                $vInput->class_methods="\n".implode(get_class_methods($vInput),"();\n");
            }
            $return .= " count = [<b>" . count($vInput) . "</b>] dimension = [<b style='color:black;font-size:9px'>{$iLevel}</b>]</td></tr>
            <tr><td style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>";
            $return .=  <<<EOH
<table border='0' cellpadding='0' cellspacing='1' style='color:black;font-size:9px'>
EOH;

            while (list($vKey, $vVal) = each($vInput)){
                $return .= "<tr><td align='left' bgcolor='".$bg[$iLevel]."' valign='top' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;width:20px'><b style='color:black;font-size:9px'>";
                $return .= (is_int($vKey)) ? "" : "\"";
                $return .= _nbsp_replace(_my_html_special_chars($vKey));
                $return .= (is_int($vKey)) ? "" : "\"";
                $return .= "</b></td><td bgcolor='".$bg[$iLevel]."' valign='top' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;width:20px;'>=></td>
                <td bgcolor='".$bg[$iLevel]."' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'><b style='color:black;font-size:9px'>";

                if ($iLevel>$maxlevel and is_array($vVal)) $return .=  svar_dump("array(".sizeof($vVal)."), but Recursion Level > $maxlevel!!", ($iLevel + 1), $maxlevel);
                else if ($iLevel>$maxlevel and is_object($vVal)) $return .=  svar_dump("Object, but Recursion Level > $maxlevel!!", ($iLevel + 1), $maxlevel);
                else $return .= svar_dump($vVal, ($iLevel + 1), $maxlevel) . "</b></td></tr>";
            }
            $return .= "</table>";
        } else {
            if (gettype($vInput)=="NULL") $return .="null";
            else $return .=gettype($vInput);
            if (($vInput)!="") $return .= " (<b style='color:black;font-size:9px'>".($vInput)."</b>) </td>";
        }
        $return .= "</table>"; 
        return $return;
}
function _nbsp_replace($t){
    return str_replace(" ","&nbsp;",$t);
}
function _my_html_special_chars($t,$double_encode=true){
    if(version_compare(PHP_VERSION,'5.3.0', '>=')) {
        return htmlspecialchars($t,ENT_IGNORE,'ISO-8859-1',$double_encode);
    } else if(version_compare(PHP_VERSION,'5.2.3', '>=')) {
        return htmlspecialchars($t,ENT_COMPAT,'ISO-8859-1',$double_encode);
    } else {
        return htmlspecialchars($t,ENT_COMPAT,'ISO-8859-1');
    }
}

1

由于我是通过Google找到的,因此搜索了如何设置json的格式,以使其更具可读性,以进行故障排除。

ob_start() ;  print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "\$json".str_replace( '}', "}\n", $ob_out );

1
这可以使用print_r($ json,1)大大简化
SorcyCat 2011年

1

如果您的服务器在发送标头后反对您更改标头(以纯文本格式),或者您不想更改代码,则只需从浏览器“查看源代码”文本编辑器(甚至记事本)新行比您的浏览器更好,并且会造成混乱:

Array([root] => 1 [sub1] => Array()[sub2] => Array()[sub3] => Array()[sub4] => Array()...

转换为选项卡式表示形式:

[root] => 1
  [sub1] => Array
      (
      )

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

如果要在其他函数中使用结果,则可以使用var_export将有效的PHP表达式作为字符串获取

$something = array(1,2,3);
$some_string = var_export($something, true);

对于人们在问题中所做的很多事情,我希望他们提供了一个函数,并且不会复制粘贴多余的日志记录。在这些情况下可var_export实现类似的输出var_dump


1

这是pp的版本,适用于对象和数组(我也取出了逗号):

function pp($arr){
    if (is_object($arr))
        $arr = (array) $arr;
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_object($val))
                $val = (array) $val;
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => array(' . pp($val) . ')</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . ($val == '' ? '""' : $val) . '</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}

1

这是另一个简单的转储,没有print_r的所有开销:

function pretty($arr, $level=0){
    $tabs = "";
    for($i=0;$i<$level; $i++){
        $tabs .= "    ";
    }
    foreach($arr as $key=>$val){
        if( is_array($val) ) {
            print ($tabs . $key . " : " . "\n");
            pretty($val, $level + 1);
        } else {
            if($val && $val !== 0){
                print ($tabs . $key . " : " . $val . "\n"); 
            }
        }
    }
}
// Example:
$item["A"] = array("a", "b", "c");
$item["B"] = array("a", "b", "c");
$item["C"] = array("a", "b", "c");

pretty($item);

// -------------
// yields
// -------------
// A : 
//     0 : a
//     1 : b
//     2 : c
// B : 
//     0 : a
//     1 : b
//     2 : c
// C : 
//     0 : a
//     1 : b
//     2 : c

0

我认为在php中漂亮打印json的最佳解决方案是更改标题:

header('Content-type: text/javascript');

(如果您执行text / json,许多浏览器将提示下载... facebook对它们的图形协议使用text / javascript,所以它一定不会太糟)


0

FirePHP是一个firefox插件,该插件具有非常漂亮的日志记录功能。



0

扩展@stephen的答案,添加了一些非常小的调整以用于显示。

function pp($arr){
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => array(' . pp($val) . '),</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . ($val == '' ? '""' : $val) . ',</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}

将格式化任何多维数组,如下所示:

在此处输入图片说明


0

这是我通常使用的:

$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";

0

我做了这个功能来打印数组进行调试:

    function print_a($arr) {
        print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>';
    }

希望对您有帮助,Tziuka S.


0

如何从https://github.com/hazardland/debug.php命名为debug的单个独立函数。

典型的debug() html输出如下所示:

在此处输入图片说明

但是您也可以将数据输出为具有相同功能的纯文本(带有4个空格缩进的制表符),如下所示(甚至在需要时将其记录在文件中):

string : "Test string"
boolean : true
integer : 17
float : 9.99
array (array)
    bob : "alice"
    1 : 5
    2 : 1.4
object (test2)
    another (test3)
        string1 : "3d level"
        string2 : "123"
        complicated (test4)
            enough : "Level 4"


-1

我将其中的一些选项合并为一个小辅助函数

http://github.com/perchten/neat_html/

您可以打印到html,整洁地输出,以及对字符串进行jsonify,自动打印或return等。

它处理文件包括,对象,数组,空值与假值等。

当以更环境的方式使用设置时,还有一些可全局访问(但作用域广泛)的帮助程序

加上动态的,基于数组的或字符串的可选参数。

而且,我不断添加它。因此受支持:D


如果您包含一些显示其用法的代码,这将是一个更好的答案。
Teepeemm '16
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.