2011-12-16 11 views
18

Jak mogę wydrukować tablicę więc zamiast być wszystko w jednej linii, takich jak:Macierz drukowania PHP z jednym kluczem na linię, dzięki czemu jest łatwiejsza dla oczu?

Array ([0] => Array ([Palabra] => correr [Tipo] => Verbo) [1] => Array ([Palabra] => es [Tipo] => Verbo [PersonaSujeto] => tercera [CantidadSujeto] => singular [Tiempo] => presente) 

Pokazuje coś bardziej czytelnego jak ten lub podobny:

Array ( 
    [0] => Array ( 
     [Palabra] => correr 
     [1] => Array ( 
      [Tipo] => Verbo 
      [Tiempo] => Infinitivo)) 
    [1] => Array ( 
     [Palabra] => es 
     [Tipo] => Verbo 
     [PersonaSujeto] => tercera 
     [CantidadSujeto] => singular 
     [Tiempo] => presente) 
+5

znaczy tak: 'echo„

'; print_r($array); echo '
”;' –

+1

Tak, na pewno znaczy, że tak :) – Alfabravo

Odpowiedz

57

To jest drukowany z przerwą linii, ale w HTML podziały wiersza są bez znaczenia.Można wykonać jedną z 2 rzeczy:

  1. Powiedz przeglądarkę nie jest to dokument HTML, ale tekst, umieszczając poniższy kod przed każdym wyjściem jest wysyłany:

    header('Content-type: text/plain'); 
    
  2. Simply mają <pre> znaczniki około drukowanej tablicy:

    echo '<pre>'; print_r($array); echo '</pre>'; 
    
+4

+1 dla zawartości typu –

3

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("&nbsp;", 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("&nbsp;", $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:

enter image description here

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! :)

+0

Dzięki za print_p –

0

Dodaj <pre>

Przykład:

<pre> 
<?php 
    print_r($array); 
?> 
<pre> 
7

Uwielbiam podświetlanie kodu. Ten przykład pokazuje beatyfikowany tablicę kodu wyróżnionego

<?php 
$debug_data = array(1,2,5,6,8,7,'aaa'); 

echo str_replace(array('&lt;?php&nbsp;','?&gt;'), '', highlight_string('<?php ' .  var_export($debug_data, true) . ' ?>', true)); 
?> 

enter image description here

+0

myślę zamierzam dodać do mojego osobistego kodu, Uwielbiam to :) –

0
  1. W innych odpowiedzi słownie: Są już nowe linie i zakładki w wyjściu print_r. Możesz to zobaczyć, używając <pre> lub jako zwykłego tekstu.

  2. może zainstalować xdebug aby wyjście print_r bardziej czytelnej

0

Wszystkie powyższe odpowiedzi są dobre. Lubię dodawać funkcję php w mojej funkcji, więc w dowolnym miejscu w mojej aplikacji mogę po prostu zadzwonić pod numer debug($my_array);, aby zrzucić tablicę na ekran (lub html), z ładnym formatowaniem czytelności. Here it is on github.

Oczywiście w dzisiejszych czasach większość serwerów i frameworków ma własną wbudowaną wersję czegoś podobnego, ale do budowania czegoś od zera to działa.

+0

Podany link jest zepsuty. –

+0

Ups, dzięki za heads up. Naprawiony. – joshdutcher

1

Jest najlepszym przyjacielem programisty PHP:

function pa($value, $exit = true){ 
    echo "<pre>"; 
    print_r($value); 
    echo "</pre>"; 
    if($exit){ 
    exit(); 
    } 
} 

Jeśli trzeba używać tak:

pa($arr); 

lub

pa($obj); 

Jeśli nie chcą zjazd

pa($obj, false); 
Powiązane problemy