2009-07-22 2 views
110

Я исправляю некоторые скрипты PHP, и мне не хватает рубинового симпатичного принтера. то естьЕсть ли довольно печать для PHP?

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 становится еще красивей принтер. –

+1

Спасибо, оказывается, это просто проблема именования! Я говорю вам, что вы говорите pa_ta_to. –

+105

Чтобы сделать его более привлекательным в браузере, используйте: echo "

"; print_r($arr); echo "
"; – Domenic

21

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

+5

+1 для Krumo. Очень хороший инструмент! –

+0

Я использовал его раньше - и это довольно круто) – Malachi

+0

получение предупреждения о связи в хроме – circusdei

3
error_log(print_r($variable,true)); 

отправить в системный журнал или журнал событий для окон

3

Если вы делаете больше отладки Xdebug имеет важное значение. По умолчанию он переопределяет var_dump() с собственной версией which displays a lot more information than PHP's default var_dump().

Существует также Zend_Debug.

+2

Blarg. Xdebug's var dump _sucks_, потому что он выводит HTML ... О да, выглядит _fantastic_ в тесте CLI. – jason

+0

Xdebug использует различные выходные данные для CLI в эти дни. –

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

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

2

один вкладыш, который даст вам грубый эквивалент "просмотр источника", чтобы увидеть содержимое массива:

предполагает PHP 4.3.0+:

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

6

Не забудьте установите html_errors = on в php.ini, чтобы получить красивую печать var_dump() в сочетании с xdebug.

0

Я думаю, что лучшее решение для симпатичной печати JSON в PHP, чтобы изменить заголовок:

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

(если вы делаете текст/JSON многих браузеров незамедлительной загрузку ...facebook делает текст/JavaScript для их графа протокола, поэтому он не должен быть слишком плохо)

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

почему downvote? хорошо работает, не так ли? Я не собираюсь плакать об этом просто любопытно, если я делаю что-то неправильно. Я самоучкой, поэтому, пожалуйста, просветите меня. – Laurence

158

Это то, что я использую, чтобы напечатать мои массивы:

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

Волшебные сопровождающую pre тега ,

+0

вот что я искал - пару строк, легко читается – circusdei

+2

Да, пятно на !! –

+1

Легко и идеально. У меня хороший день. –

1

Если ваш сервер пытается вам изменить заголовки (на обычный текст) после того, как некоторые из них были отправлены или если вы не хотите изменять свой код, просто «просмотреть исходный код» в своем браузере - ваш текстовый редактор (даже блокнот) будет обрабатывать новые строки лучше, чем ваш браузер, и превратится в беспорядочный беспорядок:

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

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

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

    [sub2] => Array 
     (
    ) 

    [sub3] => Array 
     (
    ) 

    [sub4] => Array 
     (
    )... 
-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); 

Or столько аргументов вы даете.

0

FirePHP - плагин firefox, который печатает, обладает очень красивой функцией регистрации.

1

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

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

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

21

Лучшее, что я нашел еще это:

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

И если вы хотите подробнее:

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

Добавление <pre> HTML тег в среде веб-разработки будут соблюдать новые строки \n из функция печати правильно, без необходимости добавлять некоторые html <br>

+1

nice trick thanks –

-1

Я вытащил несколько из этих вариантов ее в крошечный небольшой вспомогательную функцию в

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

Вы можете печатать HTML, аккуратно выводится, а также jsonify строка, автоматическая печать или возврат и т.д.

Он обрабатывает файл включает в себя объекты , массивы, нули против ложных и т. п.

Там также некоторые доступные по всему миру (но хорошо заданной области) помощники при использовании параметров в более экологически как способ

Plus динамические массивы на основе или строковые необязательные аргументы.

И, я продолжаю добавлять к нему. Так она поддерживается: D

+0

Это был бы лучший ответ, если бы вы включили некоторый код, показывающий, как он используется. – Teepeemm

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

0

Расширяя @ ответ Иштвана, добавил несколько очень незначительных настроек для отображения.

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

будет форматировать любой многомерный массив так:

enter image description here

0

Это то, что я Usally использовать:

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

Вот версия С., который работает на объектах, а также в качестве массивов (я также вынул запятые):

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

Я не видел, чтобы кто-то упоминал о выполнении «запятой правды» с вашей командой print_r, а затем вы можете использовать его встроенный с html, не просматривая все обручи или предлагаемые многовалютные решения.

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

Кроме того, вы должны также использовать 'htmlspecialchars()' вокруг 'print_r()', чтобы защитить от возможных хранимых угроз XSS. – Christian

2

Если вы хотите более хорошее представление любой переменной PHP (чем просто обычный текст), я предлагаю вам попробовать nice_r(); он печатает значения плюс соответствующую полезную информацию (например: свойства и методы для объектов). enter image description here Отказ от ответственности: Я написал это сам.

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
        [бар] => 888
        [пу] => Массив
                (
                        [х] => 111
                        [у] => 222
                        [г] => 333
               )
)

Подробнее о print_r.

О втором параметре print_r «истинного» из документации:

Когда этот параметр установлен в TRUE, print_r() будет возвращать информацию, а не печатать его.

+0

Идеальное решение для отправки вывода с php на веб-браузер. – Kruser

2

Хороший цветной выход:

эхо svar_dump (массив ("а", "б" => "2", "с" => массив ("д", "е" => массив ("F", "г"))));

будет выглядеть так:

enter image description here

Источник:

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

Вот еще один простой дамп без всех накладных 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

Я сделал эту функцию для печати массив для отладки:

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

Надеется, что это помогает, Tziuka С.

0

Как насчет одной автономной функции с именем, как отладки из https://github.com/hazardland/debug.php.

Типичные отладки() HTML вывода выглядит следующим образом:

enter image description here

Но вы можете выводить данные в виде обычного текста с той же функцией также (с 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" 
Смежные вопросы