Чи є симпатичний принт для PHP?


110

Я виправляю деякі сценарії PHP, і мені не вистачає гарного принтера ruby. тобто

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

виведе {: one => 1}. Це навіть працює з досить складними об'єктами і значно полегшує копання у невідомий сценарій. Чи є якийсь спосіб дублювати цю функціональність у PHP?

Відповіді:


101

І те, print_r()і var_dump()виведе візуальні уявлення об'єктів в PHP.

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

42
Якщо встановити розширення XDebug, var_dump стане ще гарнішим принтером.
Алан Шторм

105
Щоб виглядати ще приємніше у браузері, використовуйте: echo "<pre>"; print_r ($ arr); ехо "</pre>";
Доменіч

13
До точки Доменіка просто оберніть його: функція pr ($ array = null) {print "<pre> <code>". print_r ($ масив). "</code> </pre>"; }
Даррен Ньютон

10
@darren_n: print_r() автоматично виводить і нічого не повертає (якщо не другий параметр true), тому ви не можете приєднатися до іншого рядка. Використовуйте натомість наступне:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Ендрю Мур

6
@Domenic Ви, ймовірно, захочете замість цього "повторити" <pre> ", htmlentities (print_r ($ arr, правда))," </pre> ", надіславши певну достовірність і пропозиції Даррена (:

158

Це те, що я використовую для друку своїх масивів:

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

Магія приходить разом із preтегом.


3
Це насправді набагато краще, ніж var_dumpтому, що var_dumpобрізає результат, якщо це великий масив чи велика струна ...
Radu Murzea

3
спрощена версія буде: echo "<pre>". print_r ($ масив, 1). "</pre>";
кубіо

Не забудьте уникнути результатів print_r: $formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo

21

Для простоти, print_r () і var_dump () не може бути бити. Якщо ви хочете чогось більш фантазійного або маєте справу з великими списками та / або глибоко вкладеними даними, Крумо полегшить ваше життя - він надасть вам добре відформатований дисплей, що згортається / розширюється.


21

Найкраще, що я знайшов, це:

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

А якщо ви хочете детальніше:

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

Додавання <pre>тегу HTML у середовищі веб-розробки буде \nправильно поважати нові рядки функції друку, без необхідності додавати трохи HTML<br>


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 та ваш веб-переглядач подбає про відступ та зробить його розбірливим.



6

Не забудьте встановити html_errors = onв php.ini, щоб отримати гарний друк var_dump () у поєднанні з xdebug.


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
    [bar] => 888
    [poo] => масив
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )
)

Детальніше про print_r .

Про другий параметр print_r "true" з документації:

Коли для цього параметра встановлено значення TRUE, print_r () поверне інформацію, а не надрукує її.


Ідеальне рішення для відправки виводу з php у веб-браузер.
Evhz

4

Це невелика функція, яку я весь час використовую, якщо ви налагоджуєте масиви. Параметр заголовка дає деяку інформацію про налагодження, як масив, який ви друкуєте. він також перевіряє, чи постачали ви його дійсний масив, і дає вам знати, якщо ви цього не зробили.

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

навіщо знищувати? працює добре, чи не так? Я не буду плакати про це просто цікаво, якщо я роблю щось не так. Я самоучка, тому просвітліть мене.
Лоранс


3

Якщо ви робите більше налагоджень, Xdebug є важливим. За замовчуванням він перекриває var_dump()свою власну версію, яка відображає набагато більше інформації, ніж за замовчуванням PHPvar_dump() .

Є також Zend_Debug .


2
Благ. Вар-дамп Xdebug смокче, оскільки він виводить HTML ... О так, це виглядає фантастично на тесті CLI.
Ясон

Xdebug використовує різні результати для CLI в наші дні.
Джефф Хаббард

3

Я не бачив, щоб хтось згадав, що робив "true true" з командою print_r, і тоді ви МОЖЕТЕ використовувати його в рядку з html, не проходячи всі обручі чи багатозабруднені рішення, що надаються.

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

Крім того, вам слід також зробити htmlspecialchars()навколо print_r(), щоб захистити від можливо збережених XSS загроз.
Крістіан

2

однострочний, який надасть вам приблизний еквівалент "перегляду джерела", щоб побачити вміст масиву:

передбачає php 4.3.0+:

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


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

2

Якщо ви хочете краще представити будь-яку змінну PHP (ніж просто звичайний текст), пропоную спробувати nice_r () ; він виводить значення плюс відповідну корисну інформацію (наприклад: властивості та методи для об'єктів). введіть тут опис зображення Відмова: Я написав це сам.


2

Гарний кольоровий вихід:

echo svar_dump (масив ("a", "b" => "2", "c" => масив ("d", "e" => масив ("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');
    }
}

1

Оскільки я виявив це через Google, шукаючи, як відформатувати json, щоб зробити його більш зрозумілим для усунення несправностей.

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

1
це можна значно спростити за допомогою print_r ($ json, 1)
SorcyCat

1

Якщо ваш сервер заперечує над зміною заголовків (звичайним текстом) після надсилання, або якщо ви не хочете змінювати код, просто "перегляньте джерело" зі свого браузера - ваш текстовий редактор (навіть блокнот) обробить нові рядки краще, ніж ваш веб-переглядач, і перетворять розгублений безлад:

Масив ([root] => 1 [sub1] => Array () [sub2] => Array () [sub3] => Array () [sub4] => Array () ...

в правильно представлене вкладку:

[root] => 1
  [sub1] => Array
      (
      )

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

Якщо ви хочете використовувати результат у подальших функціях, ви можете отримати дійсне вираження PHP у вигляді рядка за допомогою var_export :

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

Для багатьох речей, які люди роблять у своїх запитаннях, я сподіваюся, що вони присвятили функцію і не копіюють обклеювання додаткових журналів. var_exportдосягає аналогічних результатів var_dumpу цих ситуаціях.


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

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

0

Я думаю, що найкраще рішення для гарного друку json у php - це зміна заголовка:

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

(якщо ви робите text / json, багато браузерів запропонують завантажити ... facebook робить текст / javascript для їх графічного протоколу, тому це не повинно бути занадто погано)


0

FirePHP - це плагін Firefox, у якого друк має дуже гарну функцію реєстрації.



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

Форматуватиме будь-який багатовимірний масив так:

введіть тут опис зображення



0

Я зробив цю функцію для друку масиву для налагодження:

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

Сподіваюся, що це допомагає, Цюка С.


0

Як щодо однієї окремої функції, названої як налагодження з https://github.com/hazardland/debug.php .

Типовий вихідний файл 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"


-1

Я перетягнув кілька цих варіантів разом у маленьку функцію помічника

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

Ви можете друкувати в html, акуратно виводиться, а також jsonify рядок, автодрук чи повернення тощо.

Він обробляє файл включає об'єкти, масиви, нулі vs false та подібне.

Існує також кілька глобально доступних (але чітко визначених) помічників для використання налаштувань більш екологічним чином

Плюс динамічні аргументи на основі масиву або рядкові.

І я продовжую додавати його. Так це підтримується: D


Це буде кращою відповіддю, якби ви включили якийсь код із зазначенням способу його використання.
Teepeemm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.