Осмысление вывода print_r - PullRequest
       2

Осмысление вывода print_r

4 голосов
/ 10 октября 2011

Бывают случаи, когда вывод для print_r очень сложный, длинный и трудный для чтения, например, объекты, вложенные массивы, вложенные объекты, вложенные массивы, ...

Существуют ли библиотеки или инструменты, помогающие разработчикамчитать эту информацию?Что-то вроде инспектора DOM для HTML?

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Я регулярно использую эту функцию при просмотре вывода 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 голосов
/ 10 октября 2011

Установите модуль Devel и используйте функцию dpm() вместо print_r ... она выводит прекрасное представление вашей переменной (будь то строка, объект, массив и т. Д.) ) в стандартную область сообщений Drupal.

Он использует замечательную библиотеку Крумо и полностью интерактивен (вы можете расширять / сворачивать объекты / массивы). Кто-то может сказать, что для этого нужно использовать <pre> теги (и обычно они могут быть правы), но, поскольку это решение уже существует для Drupal, вы с ума сошли бы, если не используете его

Вы никогда не вернетесь к использованию print_r снова, обещаю!

0 голосов
/ 10 октября 2011

Страница справочника для print_r содержит множество комментариев с функциями, которые могут вам помочь.

Например:

  • Федерико Брикер 29-июн-2009 11:02 (Пост # 91861) см. Ниже.
  • Боб 08-май-2009 10:19 (Пост # 90759)
  • afisher8at cox dot net 17 декабря 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); 
} 
} 
?>
...