Jeśli owinąć wyjście z funkcji jak print_r
, var_dump
i var_export
w tagu <pre>
, będzie stosunkowo dobrze sformatowany.
Powodem jest to, że wyjście funkcji jest zwykłym tekstem, ale kiedy patrzysz na niego w przeglądarce, przeglądarka uznaje to za HTML. Znaki nowego wiersza w wyjściowym pliku tekstowym nie mają znaczenia dla HTML, ponieważ nowe linie są ignorowane.
Aby zobaczyć to w akcji, spróbuj obejrzeć źródło - zobaczysz tam ładnie sformatowane wyjście.
Znacznik HTML mówi w przeglądarce "wszystko wewnątrz tego bloku ma format" pre ". Nowe linie są traktowane jako nowe linie, odstępy są respektowane (HTML nie dba również o sekwencje spacji).
Tak, jesteś w lewo z czegoś takiego:
echo '<pre>'.print_r($my_array).'</pre>';
Zamiast robić to całym moim kodu, lubię używać kompozytowego funkcję tak (ja to nazywam print_p
tak jak to wpisując print_r
)
function print_p($value = false, $exit = false, $return=false, $recurse=false) {
if ($return === true && $exit === true)
$return = false;
$tab = str_repeat(" ", 8);
if ($recurse == false) {
$recurse = 0;
$output = '<div style="width:100%; border: 2px dotted red; background-color: #fbffd6; display: block; padding: 4px;">';
$backtrace = debug_backtrace();
$output .= '<b>Line: </b>'.$backtrace[0]['line'].'<br>';
$output .= '<b>File: </b> '.$backtrace[0]['file'].'<br>';
$indent = "";
} else {
$output = '';
$indent = str_repeat(" ", $recurse * 8);
}
if (is_array($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Array<br>';
$output .= "<br>array (<br>";
} else {
$output .= "array (<br>";
}
$items = array();
foreach ($value as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>)';
else
$output .= '<br>'.$indent.')';
} elseif (is_object($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Object<br>';
$output .= '<br>object ('.get_class($value).'){'."<br>";
} else {
$output .= "object (".get_class($value)."){<br>";
}
// needed conditional because base class function dump is protected
$vars = get_object_vars($value);
$vars = (is_array($vars) == true ? $vars : array());
$items = array();
foreach ($vars as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
$vars = get_class_methods($value);
$items = array();
foreach ($vars as $v) {
$items[] = $indent.$tab.$tab.$v;
}
$output .= '<br>'.$indent.$tab.'<b>Methods</b><br>'.implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>}';
else
$output .= '<br>'.$indent.'}';
} else {
if ($recurse == false) {
$output .= '<b>Type: </b> '.gettype($value).'<br>';
$output .= '<b>Value: </b> '.$value;
} else {
$output .= '('.gettype($value).') '.$value;
}
}
if ($recurse == false)
$output .= '</div>';
if ($return === false)
echo $output;
if ($exit === true)
die();
return $output;
}
... wtedy to zrobić:
print_p($my_array);
... i uzyskać wynik:
To jest dobre, bo a) odbędzie dowolny typ zmiennej, obiektów, tablic, strun, oraz b) powiedzieć, gdzie wyjście nadchodzi od. To może być naprawdę frustrujące, jeśli stracisz kontrolę nad miejscem, w którym umieściłeś wiadomość do debugowania i musisz poświęcić czas na jej wyszukiwanie! :)
znaczy tak: 'echo„
”;' –Tak, na pewno znaczy, że tak :) – Alfabravo