【问题标题】:Is there a pretty print for PHP?PHP有漂亮的印刷品吗?
【发布时间】:2010-11-13 04:21:40
【问题描述】:

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

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

将输出 {:one => 1}。这甚至适用于相当复杂的对象,并且可以更轻松地挖掘未知脚本。有没有办法在 PHP 中复制这个功能?

【问题讨论】:

    标签: php pretty-print


    【解决方案1】:

    在 PHP 5.4 中,如果您使用函数 json_encode,则可以使用 JSON_PRETTY_PRINT。

    json_encode(array('one', 'two', 'three'), JSON_PRETTY_PRINT);
    

    http://php.net/manual/en/function.json-encode.php

    【讨论】:

      【解决方案2】:

      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"
      

      【讨论】:

        【解决方案3】:

        我做了这个函数来打印一个用于调试的数组:

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

        希望对您有所帮助,Tziuka S.

        【讨论】:

          【解决方案4】:

          这是另一个没有 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
          

          【讨论】:

            【解决方案5】:

            漂亮的彩色输出:

            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');
                }
            }
            

            【讨论】:

              【解决方案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
              [酒吧] => 888
              [便便] => 数组
              (
              [x] => 111
              [y] => 222
              [z] => 333
              )
              )

              阅读更多关于print_r的信息。

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

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

              【讨论】:

              • 将输出从 php 发送到 Web 浏览器的完美解决方案。
              【解决方案7】:

              这是我用来打印数组的:

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

              pre 标签带来了魔力。

              【讨论】:

              • 这实际上比var_dump 好得多,因为var_dump 修剪结果,如果它是一个大数组或大字符串...
              • 简化版是:echo "
                " 。 print_r($array, 1) 。 "
                ";
              • 别忘了转义print_r的输出:$formatted = print_r($array, true); print "&lt;pre&gt;" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "&lt;/pre&gt;";
              【解决方案8】:

              我发现的最好的是:

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

              如果你想要更详细:

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

              在Web开发环境中添加&lt;pre&gt; HTML标签将正确尊重打印功能的换行符\n,而无需添加一些html &lt;br&gt;

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                  • 此外,您还应该在 print_r() 周围执行 htmlspecialchars(),以防止可能存储的 XSS 威胁。
                  【解决方案11】:

                  这是一个适用于对象和数组的 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;
                  }
                  

                  【讨论】:

                    【解决方案12】:

                    这是我常用的:

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

                    【讨论】:

                      【解决方案13】:

                      扩展@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;
                      }
                      

                      将像这样格式化任何多维数组:

                      【讨论】:

                        【解决方案14】:
                            <?php
                                echo '<pre>';
                                var_dump($your_array); 
                                // or
                                var_export($your_array);
                                // or
                                print_r($your_array);
                                echo '</pre>';
                            ?>
                        

                        或使用外部库,如 REF:https://github.com/digitalnature/php-ref

                        【讨论】:

                          【解决方案15】:

                          我在

                          将这些选项中的一些组合成一个很小的辅助函数

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

                          你可以打印成html,整齐的输出,以及jsonify字符串,自动打印或返回等。

                          它处理文件包含、对象、数组、null 与 false 等。

                          当以更类似于环境的方式使用设置时,还有一些全局可访问(但范围很好)的帮助器

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

                          而且,我一直在添加它。所以支持:D

                          【讨论】:

                          • 如果您包含一些显示其使用方式的代码,这将是一个更好的答案。
                          【解决方案16】:

                          如果你想在更多的函数中使用结果,你可以使用var_export获取一个有效的PHP表达式作为字符串:

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

                          对于人们在他们的问题中所做的很多事情,我希望他们已经专门提供了一个功能,而不是复制粘贴额外的日志记录。在这些情况下,var_export 的输出与var_dump 相似。

                          【讨论】:

                            【解决方案17】:

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

                            【讨论】:

                              【解决方案18】:

                              我用这个函数来调试:

                              function pre($pre=true) {
                                  if($pre) {
                                      echo "<pre>";
                                  }
                                  foreach(func_get_args as $arg) {
                                      print_r($arg);
                                      # or, if it pleases you more:
                                      # var_dump(arg); 
                                  }
                                  if($pre) {
                                      echo "<pre>";
                                  }
                              

                              }

                              这样你就不用了

                              pre($arrayOne);
                              pre($arrayTwo);
                              

                              但一口气:

                              pre($arrayOne, $arrayTwo); 
                              

                              或者你给它多少参数。

                              【讨论】:

                                【解决方案19】:

                                如果您的服务器反对您在发送某些标题后更改标题(纯文本),或者如果您不想更改代码,只需从浏览器“查看源代码”- - 你的文本编辑器(甚至记事本)会比浏览器更好地处理新行,并且会变得一团糟:

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

                                到一个正确的标签表示:

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

                                【讨论】:

                                  【解决方案20】:

                                  如果您正在调试数组,这是我一直使用的一个小功能。 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
                                  ||---------------------------------||
                                  

                                  【讨论】:

                                  • 为什么要投反对票?运作良好不是吗?我不会为此哭泣,只是好奇我是否做错了什么。我是自学成才的,请赐教。
                                  【解决方案21】:

                                  只要在输出返回字符串之前设置header('Content-type: text/plain');,这个函数就可以很好地工作

                                  http://www.php.net/manual/en/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;
                                  }
                                  ?>
                                  

                                  【讨论】:

                                    【解决方案22】:

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

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

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

                                    【讨论】:

                                      【解决方案23】:

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

                                      【讨论】:

                                        【解决方案24】:

                                        一个单行代码,可以让您大致相当于“查看源代码”来查看数组内容:

                                        假设 php 4.3.0+:

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

                                        【讨论】:

                                          【解决方案25】:

                                          因为我通过谷歌搜索如何格式化 json 以使其在故障排除时更具可读性。

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

                                          【讨论】:

                                          • 这可以使用 print_r($json,1) 大大简化
                                          【解决方案26】:

                                          对于 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 和您的浏览器将负责缩进并使其清晰易读。

                                          【讨论】:

                                            【解决方案27】:

                                            如果您要进行更多调试,Xdebug 是必不可少的。默认情况下,它会使用自己的版本which displays a lot more information than PHP's default var_dump() 覆盖var_dump()

                                            还有Zend_Debug

                                            【讨论】:

                                            • 布拉格。 Xdebug 的 var dump sucks 因为它输出 HTML...哦,是的,在 CLI 测试中看起来 fantastic
                                            • Xdebug 现在对 CLI 使用不同的输出。
                                            【解决方案28】:
                                            error_log(print_r($variable,true));
                                            

                                            发送到 Windows 的系统日志或事件日志

                                            【讨论】:

                                              【解决方案29】:

                                              为简单起见,print_r()var_dump() 无可匹敌。如果您想要一些更高级的东西,或者正在处理大型列表和/或深度嵌套的数据,Krumo 将使您的生活更轻松 - 它为您提供格式精美的折叠/展开显示。

                                              【讨论】:

                                                【解决方案30】:

                                                print_r()var_dump() 都将在 PHP 中输​​出对象的可视化表示。

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

                                                【讨论】:

                                                • 如果你安装了 XDebug 扩展,var_dump 会变成一个更漂亮的打印机。
                                                • 为了让它在浏览器中看起来更漂亮,请使用: echo "
                                                  "; print_r($arr);回声“
                                                  ”;
                                                • Domenic 的观点只是把它包装起来: function pr($array = null) { print "
                                                  " 。 print_r($array) 。 "
                                                  "; }
                                                • @darren_n: print_r() 自动输出并且不返回任何内容(除非它的第二个参数是true),因此您不能连接到另一个字符串。请改用以下内容:function pr($var) { print '&lt;pre&gt;'; print_r($var); print '&lt;/pre&gt;'; }
                                                • @Domenic 你可能想要 `echo '
                                                  ', htmlentities(print_r($arr, true)), '
                                                  ' 来代替,这也为 Darren 的建议提供了一些可信度(:
                                                猜你喜欢
                                                • 2016-11-30
                                                • 1970-01-01
                                                • 2011-04-09
                                                • 1970-01-01
                                                • 2015-09-16
                                                • 1970-01-01
                                                • 2011-10-29
                                                • 2011-08-28
                                                相关资源
                                                最近更新 更多