我正在修复一些PHP脚本,我错过了ruby的漂亮打印机。即。
require 'pp'
arr = {:one => 1}
pp arr
将输出{:one => 1}。这甚至适用于相当复杂的对象,并且更容易挖掘到未知脚本。有没有办法在PHP中复制这个功能?
答案 0 :(得分:158)
这是我用来打印数组的方法:
<pre>
<?php
print_r($your_array);
?>
</pre>
魔术带有pre
标签。
答案 1 :(得分:101)
print_r()
和var_dump()
都将在PHP中输出对象的可视化表示。
$arr = array('one' => 1);
print_r($arr);
var_dump($arr);
答案 2 :(得分:21)
为简单起见,print_r()和var_dump()无法被击败。如果你想要一些更有趣的东西或处理大型列表和/或深层嵌套数据,Krumo将使你的生活更轻松 - 它为你提供了格式良好的折叠/扩展显示。
答案 3 :(得分:21)
我发现的最好的是:
echo "<pre>";
print_r($arr);
echo "</pre>";
如果你想要它更详细:
echo "<pre>";
var_dump($arr);
echo "</pre>";
在网络开发环境中添加<pre>
HTML标记会正确地尊重打印功能的换行符\n
,而无需添加一些html <br>
答案 4 :(得分: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和您的浏览器将处理缩进并使其清晰易读。
答案 5 :(得分:7)
print_r怎么样?
答案 6 :(得分: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] =&gt; 999个
[bar] =&gt; 888个
[poo] =&gt;阵列
(
[x] =&gt; 111个
[y] =&gt; 222个
[z] =&gt; 333个
)
)
详细了解print_r。
关于文档中print_r“true”的第二个参数:
当此参数设置为TRUE时,print_r()将返回 信息而非打印信息。
答案 7 :(得分:6)
请记住在php.ini中设置html_errors = on
以便与xdebug结合使用var_dump()。
答案 8 :(得分: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
||---------------------------------||
答案 9 :(得分:3)
error_log(print_r($variable,true));
发送到syslog或eventlog for windows
答案 10 :(得分:3)
我没有看到有人提到用你的print_r命令做一个“逗号为真”,然后你可以使用它与html内联,而无需通过所有的环节或提供的多杂乱的解决方案。
print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";
答案 11 :(得分:3)
如果您正在进行更多调试,Xdebug至关重要。默认情况下,它会使用自己的版本which displays a lot more information than PHP's default var_dump()
覆盖var_dump()
。
还有Zend_Debug。
答案 12 :(得分:2)
只要在输出返回字符串
之前设置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;
}
?>
答案 13 :(得分:2)
一个单行程,它将为您提供粗略的“观察源”,以查看数组内容:
假设php 4.3.0 +:
echo nl2br(str_replace(' ', ' ', print_r($_SERVER, true)));
答案 14 :(得分:2)
一个很好的彩色输出:
echo svar_dump(array(&#34; a&#34;,&#34; b&#34; =&gt;&#34; 2&#34;,&#34; c&#34; =&gt; array( &#34; d&#34;&#34; E&#34; =&GT;阵列(&#34; F&#34;&#34; G&#34;))));
将如下所示:
源:
<?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(" "," ",$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');
}
}
答案 15 :(得分:2)
如果你想要更好地表示任何PHP变量(而不仅仅是纯文本),我建议你试试nice_r();它打印出值以及相关的有用信息(例如:对象的属性和方法)。 免责声明:我自己写的。
答案 16 :(得分:1)
如果您的服务器在发送一些邮件后对您更改标题(简单文本),或者您不想更改代码,只需从浏览器“查看来源” - - 你的文本编辑器(甚至是记事本)将比你的浏览器更好地处理新行,并且会变成乱七八糟的混乱:
数组([root] =&gt; 1 [sub1] =&gt;数组()[sub2] =&gt;数组()[sub3] =&gt;数组()[sub4] =&gt;数组()..
进入正确的标签表示:
[root] => 1
[sub1] => Array
(
)
[sub2] => Array
(
)
[sub3] => Array
(
)
[sub4] => Array
(
)...
答案 17 :(得分:1)
如果要在更多函数中使用结果,可以使用var_export将有效的PHP表达式作为字符串获取:
$something = array(1,2,3);
$some_string = var_export($something, true);
对于人们在他们的问题中所做的很多事情,我希望他们专注于一个功能而不是复制粘贴额外的日志记录。在这些情况下,var_export
达到var_dump
的类似输出。
答案 18 :(得分: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
答案 19 :(得分:1)
因为我通过google搜索了如何格式化json以使其更易于排除故障。
ob_start() ; print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "\$json".str_replace( '}', "}\n", $ob_out );
答案 20 :(得分: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;
}
答案 21 :(得分:0)
在PHP 5.4中,如果使用json_encode函数,则可以使用JSON_PRETTY_PRINT。
json_encode(array('one', 'two', 'three'), JSON_PRETTY_PRINT);
答案 22 :(得分: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"
答案 23 :(得分:0)
我使用此函数打印一个数组进行调试:
function print_a($arr) {
print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>';
}
希望它有所帮助,Tziuka S。
答案 24 :(得分:0)
这是我通常使用的:
$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";
答案 25 :(得分: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;
}
将格式化任何多维数组:
答案 26 :(得分:0)
<?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
答案 27 :(得分:0)
FirePHP是一个firefox插件,打印具有非常漂亮的日志记录功能。
答案 28 :(得分:0)
我认为在php中漂亮打印json的最佳解决方案是更改标题:
header('Content-type: text/javascript');
(如果你做text / json很多浏览器会提示下载... facebook为他们的图形协议做文本/ javascript所以它一定不能太糟糕)
答案 29 :(得分:-1)
我把这些选项中的一些放在了
的小帮助函数中http://github.com/perchten/neat_html/
你可以打印到html,整齐输出,以及jsonify字符串,自动打印或返回等。
它处理文件包含,对象,数组,nulls与false等。
还有一些全球可访问(但范围很广)的帮助器,用于以更环保的方式使用设置
加上动态,基于数组或字符串的可选参数。
而且,我一直在增加它。所以它得到了支持:D
答案 30 :(得分:-2)
我使用此函数进行调试:
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);
或者你提供的参数很多。