C'è una bella stampa per PHP?


110

Sto aggiustando alcuni script PHP e mi manca la bella stampante di Ruby. vale a dire

require 'pp'
arr = {:one => 1}
pp arr

produrrà {: one => 1}. Funziona anche con oggetti abbastanza complessi e rende molto più facile scavare in uno script sconosciuto. C'è un modo per duplicare questa funzionalità in PHP?

Risposte:


101

Sia print_r()e var_dump()stamperà rappresentazioni visive di oggetti all'interno PHP.

$arr = array('one' => 1);
print_r($arr);
var_dump($arr);

42
Se installi l'estensione XDebug, var_dump diventa una stampante ancora più carina.
Alan Storm,

105
Per renderlo ancora più bello in un browser usa: echo "<pre>"; print_r ($ arr); echo "</pre>";
Domenic

13
Per dirlo con Domenic basta racchiuderlo: function pr ($ array = null) {print "<pre> <code>". print_r ($ array). "</ code> </ pre>"; }
Darren Newton

10
@darren_n: print_r() restituisce automaticamente e non restituisce nulla (a meno che il suo secondo parametro non sia true), quindi non puoi concatenarlo a un'altra stringa. Utilizza invece il seguente:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Andrew Moore

6
@Domenic Probabilmente vorrai `echo '<pre>', htmlentities (print_r ($ arr, true)), '</pre>' invece, prestando credibilità anche al suggerimento di Darren (:

158

Questo è ciò che uso per stampare i miei array:

<pre>
    <?php
        print_r($your_array);
    ?>
</pre>

La magia arriva con il pretag.


3
Questo è in realtà molto meglio che var_dumpperché var_dumptaglia il risultato se si tratta di un grande array o di una grande stringa ...
Radu Murzea

3
una versione semplificata sarà: echo "<pre>". print_r ($ array, 1). "</ pre>";
diezsiete

Non dimenticare di sfuggire all'uscita di print_r: $formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo

21

Per semplicità, print_r () e var_dump () non possono essere battuti. Se vuoi qualcosa di un po 'più elaborato o hai a che fare con elenchi di grandi dimensioni e / o dati profondamente nidificati, Krumo ti renderà la vita molto più semplice: ti fornisce un display comprimibile / espandibile ben formattato.


21

Il meglio che ho trovato finora è questo:

echo "<pre>";
print_r($arr);
echo "</pre>";

E se lo vuoi più dettagliato:

echo "<pre>";
var_dump($arr);
echo "</pre>";

L'aggiunta di un <pre>tag HTML in un ambiente di sviluppo web rispetterà \ncorrettamente le nuove righe della funzione di stampa, senza dover aggiungere alcun html<br>


19

Per PHP, puoi facilmente sfruttare l'HTML e un semplice codice ricorsivo per creare una bella rappresentazione di array e oggetti annidati.

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;
}

Questo stamperà l'array come un elenco di elenchi HTML nidificati. HTML e il tuo browser si occuperanno del rientro e renderlo leggibile.



6

Ricordati di impostare html_errors = onin php.ini per ottenere una bella stampa di var_dump () in combinazione con xdebug.


6

Il modo migliore per farlo è

echo "<pre>".print_r($array,true)."</pre>";

Esempio:

$array=array("foo"=>"999","bar"=>"888","poo"=>array("x"=>"111","y"=>"222","z"=>"333"));
echo "<pre>".print_r($array,true)."</pre>";

Risultato:

Array
(
    [foo] => 999
    [bar] => 888
    [poo] => Array
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )
)

Ulteriori informazioni su print_r .

Informazioni sul secondo parametro di print_r "true" dalla documentazione:

Quando questo parametro è impostato su TRUE, print_r () restituirà le informazioni invece di stamparle.


Soluzione perfetta per inviare output da php al browser web.
Evhz

4

Questa è una piccola funzione che uso sempre ed è utile se stai eseguendo il debug di array. Il parametro title ti dà alcune informazioni di debug come l'array che stai stampando. controlla anche se gli hai fornito un array valido e ti fa sapere se non l'hai fatto.

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.";
        }
}

Utilizzo di base:

//your array
$array = array('cat','dog','bird','mouse','fish','gerbil');
//usage
print_array("PETS", $array);

risultati:

PETS
||---------------------------------||

Array
(
    [0] => cat
    [1] => dog
    [2] => bird
    [3] => mouse
    [4] => fish
    [5] => gerbil
)

END PETS
||---------------------------------||

perché downvote? funziona bene non è vero? Non piangerò per questo solo curioso di fare qualcosa di sbagliato. Sono un autodidatta quindi per favore illuminami.
Laurence



3

Non ho visto che qualcuno abbia menzionato di fare una "virgola true" con il tuo comando print_r, e quindi PUOI usarlo in linea con html senza passare attraverso tutti i cerchi o le soluzioni dall'aspetto multi-disordinato fornite.

print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";

Inoltre, dovresti anche fare il htmlspecialchars()giro del print_r(), per proteggerti dalle minacce XSS eventualmente archiviate.
Christian

2

una riga che ti darà l'equivalente approssimativo di "visualizzazione della sorgente" per vedere il contenuto dell'array:

presuppone php 4.3.0+:

echo nl2br(str_replace(' ', ' ', print_r($_SERVER, true)));


2

Questa funzione funziona abbastanza bene fintanto che si imposta header('Content-type: text/plain'); prima dell'output della stringa di ritorno

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;
}
?>

2

Se vuoi una rappresentazione migliore di qualsiasi variabile PHP (oltre al semplice testo), ti suggerisco di provare nice_r () ; stampa i valori più le informazioni utili rilevanti (es: proprietà e metodi per gli oggetti). inserisci qui la descrizione dell'immagine Disclaimer: l' ho scritto io stesso.


2

Un bel risultato colorato:

echo svar_dump (array ("a", "b" => "2", "c" => array ("d", "e" => array ("f", "g"))));

sarà simile a:

inserisci qui la descrizione dell'immagine

fonte:

<?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(" ","&nbsp;",$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');
    }
}

1

Da quando l'ho trovato tramite google cercando come formattare json per renderlo più leggibile per la risoluzione dei problemi.

ob_start() ;  print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "\$json".str_replace( '}', "}\n", $ob_out );

1
questo può essere notevolmente semplificato usando print_r ($ json, 1)
SorcyCat

1

Se il tuo server si oppone alla modifica delle intestazioni (in testo normale) dopo che alcune sono state inviate, o se non vuoi cambiare il tuo codice, "visualizza sorgente" dal tuo browser editor di testo (anche il blocco note) elaborerà nuove righe meglio del tuo browser e trasformeranno un pasticcio confuso:

Array ([root] => 1 [sub1] => Array () [sub2] => Array () [sub3] => Array () [sub4] => Array () ...

in una rappresentazione a schede correttamente:

[root] => 1
  [sub1] => Array
      (
      )

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

Se vuoi usare il risultato in ulteriori funzioni, puoi ottenere un'espressione PHP valida come stringa usando var_export :

$something = array(1,2,3);
$some_string = var_export($something, true);

Per molte delle cose che le persone fanno nelle loro domande, spero che abbiano dedicato una funzione e non stiano copiando incollando la registrazione extra in giro. var_exportraggiunge un output simile a var_dumpin queste situazioni.


1

Ecco una versione di pp che funziona sia per gli oggetti che per gli array (ho anche eliminato le virgole):

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;
}

1

Ecco un altro semplice dump senza tutto il sovraccarico di 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

0

Penso che la soluzione migliore per stampare abbastanza json in php sia cambiare l'intestazione:

header('Content-type: text/javascript');

(se usi text / json molti browser ti chiederanno un download ... facebook fa text / javascript per il loro protocollo grafico quindi non deve essere troppo male)


0

FirePHP è un plugin per Firefox che stampa ha una caratteristica di registrazione molto carina.



0

Espandendo la risposta di @ stephen, sono state aggiunte alcune modifiche molto minori a scopo di visualizzazione.

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;
}

Formatterà qualsiasi array multidimensionale in questo modo:

inserisci qui la descrizione dell'immagine


0

Questo è quello che uso abitualmente:

$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";

0

Ho creato questa funzione per stampare un array per il debug:

    function print_a($arr) {
        print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>';
    }

Spero che aiuti, Tziuka S.


0

Che ne dici di una singola funzione autonoma denominata debug da https://github.com/hazardland/debug.php .

Il tipico output html di debug () è simile al seguente:

inserisci qui la descrizione dell'immagine

Ma puoi anche produrre dati come testo normale con la stessa funzione (con 4 tab con rientranza dello spazio) in questo modo (e persino registrarli nel file se necessario):

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"


-1

Ho riunito alcune di queste opzioni in una piccola funzione di aiuto a

http://github.com/perchten/neat_html/

È possibile stampare in html, stampare in modo ordinato, nonché jsonificare la stringa, stampare automaticamente o restituire ecc.

Gestisce file include, oggetti, array, null vs false e simili.

Esistono anche alcuni helper accessibili a livello globale (ma ben definiti) per quando si utilizzano le impostazioni in un modo più simile all'ambiente

Più argomenti facoltativi dinamici, basati su array o stringa.

E continuo ad aggiungerlo. Quindi è supportato: D


Questa sarebbe una risposta migliore se includessi un codice che mostra come viene utilizzato.
Teepeemm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.