Есть ли красивая печать для PHP?
я исправляю некоторые PHP-скрипты, и мне не хватает симпатичного принтера ruby. то есть
require 'pp'
arr = {:one => 1}
pp arr
выведет {: one = > 1}. Это даже работает с довольно сложными объектами и делает копание в неизвестном скрипте намного проще. Есть ли способ дублировать эту функциональность в PHP?
30 ответов:
и
print_r()
иvar_dump()
будет выводить визуальные представления объектов в PHP.$arr = array('one' => 1); print_r($arr); var_dump($arr);
это то, что я использую для печати моих массивов:
<pre> <?php print_r($your_array); ?> </pre>
магия начинается с
pre
тег.
для простоты, print_r () и var_dump () не может бить. Если вы хотите что-то немного любитель или имеете дело с большими списками и/или глубоко вложенных данных Krumo сделает вашу жизнь намного проще - он предлагает вам красиво отформатирована сворачивание/разворачивание экрана.
лучшее, что я нашел, это:
echo "<pre>"; print_r($arr); echo "</pre>";
и если вы хотите его более подробно:
echo "<pre>"; var_dump($arr); echo "</pre>";
добавлять
<pre>
HTML тег в среде веб-разработки будет уважать новые строки\n
функции печати правильно, без необходимости добавлять некоторые html<br>
для 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 и ваш браузер позаботятся о отступах и сделают его разборчивым.
Не забудьте поставить
html_errors = on
в php.ini, чтобы получить довольно печать var_dump () в сочетании с xdebug.
лучший способ сделать это
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] = > Array
(
[x] = > 111
[y] = > 222
[z] = > 333
)
)подробнее о print_r.
о втором параметр print_r "true" из документации:
Если этот параметр имеет значение TRUE, print_r () вернет информацию, а не печатать его.
Это небольшая функция, которую я использую все время ее удобно, если вы отлаживаете массивы. Параметр 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 ||---------------------------------||
Если вы делаете больше отладки, Xdebug имеет важное значение. По умолчанию он переопределяет
var_dump()
с его собственной версии который отображает гораздо больше информации, чем PHP по умолчаниюvar_dump()
.там же метода zend_debug.
Я не видел, чтобы кто-то упоминал, что делает "запятую true" с вашей командой print_r, а затем вы можете использовать ее встраиваемой в html, не проходя через все обручи или многослойные решения.
print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";
однострочный, который даст вам грубый эквивалент "просмотр источника", чтобы увидеть содержимое массива:
предполагает php 4.3.0+:
echo nl2br(str_replace(' ', ' ', print_r($_SERVER, true)));
эта функция работает довольно хорошо, пока вы установите
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; } ?>
Если вы хотите более приятное представление любой переменной PHP (чем просто обычный текст), я предлагаю вам попробовать nice_r (); Он выводит значения плюс соответствующую полезную информацию (например: свойства и методы для объектов). отказ от ответственности: Я сам это написал.
хороший цветной вывод:
echo svar_dump(array ("a","b"=>"2","c"=>array ("d","e"=>array ("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(" "," ",$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'); } }
Так как я нашел это через google, ища, как отформатировать json, чтобы сделать его более читаемым для устранения неполадок.
ob_start() ; print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "$json".str_replace( '}', "}\n", $ob_out );
если ваш сервер возражает вам изменение заголовков (в обычный текст) после того, как некоторые из них были отправлены, или если вы не хотите менять свой код, просто "просмотр исходного кода" в браузере--текстовый редактор (даже блокнот) обрабатывает новые строки лучше, чем ваш браузер, и превратит беспорядок:
Array ([root] => 1 [sub1] => Array () [sub2] => Array () [sub3] => Array () [sub4] => Array ()...
в правильную вкладку представительство:
[root] => 1 [sub1] => Array ( ) [sub2] => Array ( ) [sub3] => Array ( ) [sub4] => Array ( )...
Если вы хотите использовать результат в дальнейших функциях, вы можете получить действительное выражение PHP в виде строки с помощью var_export:
$something = array(1,2,3); $some_string = var_export($something, true);
для многих вещей, которые люди делают в своих вопросах, я надеюсь, что они выделили функцию и не копируют вставку дополнительного журнала.
var_export
достигает аналогичного результатаvar_dump
в этих ситуациях.
вот версия 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; }
вот еще один простой дамп без всех накладных расходов 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
Я думаю, что лучшее решение для красивой печати json в php-это изменить заголовок:
header('Content-type: text/javascript');
(Если вы делаете text/json, многие браузеры будут запрашивать загрузку... facebook делает текст / javascript для своего графического протокола, поэтому он не должен быть слишком плохим)
<?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
расширяя ответ @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; }
будет форматировать любой многомерный массив следующим образом:
Я сделал эту функцию для печати массива для отладки:
function print_a($arr) { print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>'; }
надеюсь, это поможет, Tziuka S.
Как насчет одной автономной функции с именем debug от 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"
в PHP 5.4 вы можете использовать JSON_PRETTY_PRINT, если вы используете функцию json_encode.
json_encode(array('one', 'two', 'three'), JSON_PRETTY_PRINT);
Я вытащил несколько из этих вариантов вместе в крошечную вспомогательную функцию в
http://github.com/perchten/neat_html/
вы можете печатать в html, аккуратно выводить, а также jsonify строку, автоматическую печать или возврат и т. д.
он обрабатывает файл включает в себя, объекты, массивы, нули против false и тому подобное.
есть также некоторые глобально доступные (но хорошо ограниченные) помощники для использования настроек в более подобной среде путь
плюс динамические, массивные или строковые необязательные аргументы.
и я продолжаю добавлять к нему. Так что это поддерживается :D