Я исправляю некоторые скрипты PHP, и мне не хватает красивого принтера Ruby. т.е.
require 'pp' arr = {:one => 1} pp arr
выведет {: one => 1}. Это даже работает с довольно сложными объектами и значительно упрощает копание в неизвестном скрипте. Есть ли способ дублировать эту функциональность в 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] => Массив
(
[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 ||---------------------------------||
error_log(print_r($variable,true));
отправить в syslog или журнал событий для окон
Если вы делаете больше отладки, Xdebug необходим. По умолчанию он переопределяет var_dump()
с собственной версией, которая отображает гораздо больше информации, чем var_dump()
по умолчанию 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 );
Если ваш сервер обращается к вам с изменением заголовков (на обычный текст) после того, как некоторые из них были отправлены или если вы не хотите менять свой код, просто «просмотрите источник» из своего браузера – ваш текстовый редактор (даже блокнот) обработает новые линии лучше, чем ваш браузер, и превратится в беспорядочный беспорядок:
Массив ([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, добавили несколько очень мелких настроек для показа.
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 .
Типичный вывод 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 строку, авто-печать или возврат и т. Д.
Он обрабатывает файлы, объекты, массивы, нули против ложных и т. П.
Есть также некоторые глобально доступные (но хорошо скопированные) помощники при использовании настроек более экологичным образом
Плюс динамические, массивные или строковые необязательные аргументы.
И я продолжаю добавлять к нему. Так что это поддерживается: D