Ответ 1
Оба print_r()
и var_dump()
будут вывод визуальных представлений объектов в PHP.
$arr = array('one' => 1);
print_r($arr);
var_dump($arr);
Я исправляю некоторые скрипты PHP, и мне не хватает рубинового принтера. то есть.
require 'pp'
arr = {:one => 1}
pp arr
выведет {: one = > 1}. Это даже работает с довольно сложными объектами и значительно усложняет работу в неизвестном script. Есть ли способ дублировать эту функциональность в PHP?
Оба 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 и ваш браузер позаботятся о отступов и сделать его разборчивым.
Как насчет print_r?
Не забудьте установить 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
[n] = > 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
||---------------------------------||
error_log(print_r($variable,true));
для отправки в syslog или eventlog для Windows
Если вы делаете больше отладки, важно Xdebug. По умолчанию он переопределяет var_dump()
своей собственной версией которая отображает гораздо больше информации, чем PHP по умолчанию var_dump()
.
Там также Zend_Debug.
Я не видел, чтобы кто-то упомянул о выполнении "запятой" с вашей командой 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 для своего графического протокола, поэтому он не должен быть слишком плохим)
FirePHP - это плагин firefox, который имеет очень приятную функцию ведения журнала.
<?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 answer, добавьте несколько незначительных настроек для показа.
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;
}
Будет форматировать любой многомерный массив следующим образом:
Это то, что я обычно использую:
$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";
Я сделал эту функцию для печати массива для отладки:
function print_a($arr) {
print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>';
}
Надеюсь, это поможет, Цука С.
Как насчет отдельной автономной функции, называемой debug от https://github.com/hazardland/debug.php.
Типичный вывод отладки() 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 строку, авто-печать или возврат и т.д.
Он обрабатывает файлы, объекты, массивы, нули против ложных и т.п.
Кроме того, некоторые глобально доступные (но хорошо скопированные) помощники при использовании настроек более похожими на окружающую среду.
Дополнительные динамические, массивные или строковые необязательные аргументы.
И я продолжаю добавлять к нему. Поэтому он поддерживал: D