2011-10-10 70 views
4

有些情況下,print_r的輸出非常複雜,很長且難以閱讀,例如,對象,嵌套數組,嵌套對象,嵌套數組,...使print_r輸出有意義

是否有庫或工具可幫助開發人員讀取此信息?像DOM檢查器的HTML?

+5

您是否嘗試在print_r()調用周圍添加

 &
?這將根據其嵌套深度打算生成的輸出。 – TRD

+0

這就是我有時候所做的:echo(「

"); print_r($array); echo("
」); – mikey

回答

5

通過print_r的輸出篩選時,我經常使用此功能。這是一個夢幻般的快速選擇。

http://www.php.net/manual/en/function.print-r.php#90759感謝鮑勃

<?php 
function print_r_tree($data) 
{ 
    // capture the output of print_r 
    $out = print_r($data, true); 

    // replace something like '[element] => <newline> (' with <a href="javascript:toggleDisplay('...');">...</a><div id="..." style="display: none;"> 
    $out = preg_replace('/([ \t]*)(\[[^\]]+\][ \t]*\=\>[ \t]*[a-z0-9 \t_]+)\n[ \t]*\(/iUe',"'\\1<a href=\"javascript:toggleDisplay(\''.(\$id = substr(md5(rand().'\\0'), 0, 7)).'\');\">\\2</a><div id=\"'.\$id.'\" style=\"display: none;\">'", $out); 

    // replace ')' on its own on a new line (surrounded by whitespace is ok) with '</div> 
    $out = preg_replace('/^\s*\)\s*$/m', '</div>', $out); 

    // print the javascript function toggleDisplay() and then the transformed output 
    echo '<script language="Javascript">function toggleDisplay(id) { document.getElementById(id).style.display = (document.getElementById(id).style.display == "block") ? "none" : "block"; }</script>'."\n$out"; 
} 
?> 

你可以把它放在你的主題的template.php文件中,如果你使用的Drupal作爲標籤的意味。

2

安裝Devel Module並使用dpm()函數代替print_r ...它將變量(無論是字符串,對象,數組等)的可愛表示打印到標準Drupal消息區域中。

它利用了美妙的Krumo Library,並且是完全交互式的(可以展開/摺疊對象/數組)。有人可能會說使用<pre>這個標籤(通常他們可能是正確的),但由於Drupal已經存在這種解決方案,你會發瘋,不使用它

你永遠不會再回到使用print_r我保證!

0

print_r的手冊頁有很多功能可以幫助你的評論。

例如:

  • 費德里科布里克29君-2009 11:02(帖子#91861)見下文。
  • 鮑勃08月 - 2009年10:19(帖子#90759)
  • afisher8在COX點網17日 - 12月2008年04:53(帖子#87705)
  • 還有更多...

這是我用過幾次的一個:

<?php 
function print_nice($elem,$max_level=10,$print_nice_stack=array()){ 
if(is_array($elem) || is_object($elem)){ 
    if(in_array(&$elem,$print_nice_stack,true)){ 
     echo "<font color=red>RECURSION</font>"; 
     return; 
    } 
    $print_nice_stack[]=&$elem; 
    if($max_level<1){ 
     echo "<font color=red>nivel maximo alcanzado</font>"; 
     return; 
    } 
    $max_level--; 
    echo "<table border=1 cellspacing=0 cellpadding=3 width=100%>"; 
    if(is_array($elem)){ 
     echo '<tr><td colspan=2 style="background-color:#333333;"><strong><font color=white>ARRAY</font></strong></td></tr>'; 
    }else{ 
     echo '<tr><td colspan=2 style="background-color:#333333;"><strong>'; 
     echo '<font color=white>OBJECT Type: '.get_class($elem).'</font></strong></td></tr>'; 
    } 
    $color=0; 
    foreach($elem as $k => $v){ 
     if($max_level%2){ 
      $rgb=($color++%2)?"#888888":"#BBBBBB"; 
     }else{ 
      $rgb=($color++%2)?"#8888BB":"#BBBBFF"; 
     } 
     echo '<tr><td valign="top" style="width:40px;background-color:'.$rgb.';">'; 
     echo '<strong>'.$k."</strong></td><td>"; 
     print_nice($v,$max_level,$print_nice_stack); 
     echo "</td></tr>"; 
    } 
    echo "</table>"; 
    return; 
} 
if($elem === null){ 
    echo "<font color=green>NULL</font>"; 
}elseif($elem === 0){ 
    echo "0"; 
}elseif($elem === true){ 
    echo "<font color=green>TRUE</font>"; 
}elseif($elem === false){ 
    echo "<font color=green>FALSE</font>"; 
}elseif($elem === ""){ 
    echo "<font color=green>EMPTY STRING</font>"; 
}else{ 
    echo str_replace("\n","<strong><font color=red>*</font></strong><br>\n",$elem); 
} 
} 
?>