有一个漂亮的PHP打印?

我正在修复一些PHP脚本,我错过了ruby漂亮的打印机。 即

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

会输出{:1 => 1}。 这甚至可以处理相当复杂的对象,使得挖掘未知脚本变得更容易。 有什么方法可以在PHP中复制这个function吗?

print_r()var_dump()都会输出PHP中对象的可视表示。

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

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

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

魔术带有pre标签。

为了简单起见, print_r()和var_dump()不能被击败。 如果你想要一些更有趣的东西,或者正在处理大量的列表和/或深度嵌套的数据, Krumo会让你的生活变得更容易 – 它为你提供了一个格式良好的折叠/展开显示。

我发现的最好的是这样的:

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

如果你想要更详细的:

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

在Web开发环境中添加一个<pre> HTML标记将正确地尊重打印函数的换行符,而不必添加一些html <br>

对于PHP,您可以轻松利用HTML和一些简单的recursion代码来嵌套数组和对象。

 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和您的浏览器将会处理缩进并使其清晰可见。

如何print_r?

http://www.php.net/print_r

请记住在php.ini中设置html_errors = on ,以便与xdebug相结合地打印var_dump()。

最好的方法是

 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()将返回信息而不是打印它。

如果您正在debugging数组,那么这是我使用它的一个小function。 title参数为您提供一些debugging信息,作为您正在打印的数组。 它也检查你是否提供了一个有效的数组,并让你知道,如果你没有。

 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 ||---------------------------------|| 
 error_log(print_r($variable,true)); 

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

如果你正在做更多的debugging, Xdebug是必不可less的。 默认情况下,它会使用自己的版本来替代var_dump() ,它比PHP的默认var_dump()显示更多的信息 。

还有Zend_Debug 。

我没有看到有人提到用你的print_r命令做一个“逗号真正的”,然后你可以用html内联使用它,而不需要经过所有的箍环或提供的多杂乱的解决scheme。

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

一个简单的内容,将给你大致相当于“观看源”,看arrays的内容:

假设php 4.3.0+:

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

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

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; } ?> 

如果你想更好的表示任何PHPvariables(不仅仅是纯文本),我build议你尝试nice_r() ; 它打印出值和相关的有用信息(例如:对象的属性和方法)。 在这里输入图像说明 免责声明:我自己写了这个。

一个不错的彩色输出:

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

因为我通过谷歌search如何格式化json,使其更易于排除故障。

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

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

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

转换为正确的标签表示forms:

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

如果要在更多的函数中使用结果,可以使用var_export将一个有效的PHPexpression式作为string获取 :

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

对于人们在问题中所做的很多事情,我希望他们已经专注了一个function,而不是复制粘贴额外的日志logging。 在这种情况下, var_export可以实现类似于var_dump输出。

这是一个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; } 

这是另一个简单的转储,没有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 

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

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

(如果你做文本/ JSON的许多浏览器将提示下载… Facebook的文字/ JavaScript的graphics协议,所以它不能太糟糕)

FirePHP是一个Firefox插件,打印有一个非常漂亮的日志loggingfunction。

  <?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

扩展@斯蒂芬的答案,为显示目的添加了一些非常小的调整。

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

将格式化任何multidimensional array,如下所示:

在这里输入图像说明

这是我通常使用的:

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

我让这个函数打印一个数组进行debugging:

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

希望它有帮助,Tziuka S.

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

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

在这里输入图像说明

但是你也可以像这样以纯文本的forms输出数据(具有4个空格缩进的选项卡)(如果需要,甚至可以将它们logging在文件中):

 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" 

在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

我把这些选项中的一部分放到了一个小小的帮助函数中

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

你可以打印到html,整齐输出,以及jsonifystring,自动打印或返回等。

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

还有一些全球可访问(但范围很广)的助手,当以更环境的方式使用设置时

加上dynamic的,基于数组或string的可选参数。

而且,我不断join。 所以支持:D