web-dev-qa-db-fra.com

Existe-t-il un joli imprimé pour PHP?

Je corrige quelques scripts PHP et il me manque la jolie imprimante de Ruby. c'est à dire.

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

affichera {: one => 1}. Cela fonctionne même avec des objets assez complexes et facilite beaucoup l'exploration d'un script inconnu. Existe-t-il un moyen de dupliquer cette fonctionnalité en PHP?

110
Aaron Lee

Les deux print_r() et var_dump() afficheront des représentations visuelles d'objets dans PHP.

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

C’est ce que j’utilise pour imprimer mes tableaux:

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

La magie vient avec la balise pre.

158
Joel Hernandez

Pour plus de simplicité, print_r () et var_dump () ne peuvent pas être battus. Si vous voulez quelque chose d'un peu plus sophistiqué ou si vous traitez avec de grandes listes et/ou des données profondément imbriquées, Krumo vous facilitera la vie beaucoup plus facilement.

21
Sean McSomething

Le meilleur que j'ai trouvé à ce jour est le suivant: 

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

Et si vous voulez plus de détails: 

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

Ajouter une balise HTML <pre> dans un environnement de développement Web respectera correctement le newlines \n de la fonction d’impression, sans avoir à ajouter du code html <br>

21
Guillaume Chevalier

Pour PHP, vous pouvez facilement tirer parti du HTML et de quelques codes récursifs simples pour créer une jolie représentation des tableaux et objets imbriqués.

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

Cela imprimera le tableau sous forme de liste de listes HTML imbriquées. HTML et votre navigateur s’occuperont d’indenter et de le rendre lisible.

19
Stephen Katulka

Que diriez-vous de print_r?

http://www.php.net/print_r

7
Turnor

N'oubliez pas de définir html_errors = on dans php.ini pour obtenir une jolie impression de var_dump () en combinaison avec xdebug.

6
pfrenssen

La meilleure façon de faire est 

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

Exemple:

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

Résultat:

Tableau
.__ (
[foo] => 999
[bar] => 888
[poo] => tableau
(
[x] => 111
[y] => 222
[z] => 333
)
)

En savoir plus sur print_r .

À propos du deuxième paramètre de print_r "true" de la documentation:

Lorsque ce paramètre est défini sur TRUE, print_r () renverra le informations plutôt que de les imprimer.

6
Mouneer

C’est une petite fonction que j’utilise tout le temps, c’est pratique si vous déboguez des tableaux. Le paramètre title vous donne des informations de débogage sur le tableau que vous imprimez. il vérifie également si vous avez fourni un tableau valide et vous permet de savoir si vous ne l'avez pas fait.

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

Utilisation de base:

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

Résultats:

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

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

END PETS
||---------------------------------||
4
Laurence

Je n'ai pas vu qui que ce soit mentionné avoir fait une "virgule" avec votre commande print_r, et ensuite vous POUVEZ l'utiliser en ligne avec HTML sans passer par toutes les solutions proposées.

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

Si vous faites plus de débogage, Xdebug est essentiel. Par défaut, il remplace var_dump() avec sa propre version qui affiche beaucoup plus d'informations que la fonction var_dump() par défaut de PHP.

Il y a aussi Zend_Debug .

3
raspi
error_log(print_r($variable,true));

envoyer à syslog ou eventlog pour windows

3
Question Mark

un one-liner qui vous donnera l'équivalent approximatif de "visualisation de la source" pour voir le contenu du tableau:

suppose php 4.3.0+:

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

2
mxmader

Cette fonction marche plutôt bien tant que vous définissez header('Content-type: text/plain'); avant de générer la chaîne de retour

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
Nathan Witt

Si vous voulez une meilleure représentation de toute variable PHP (que du texte brut), je vous suggère d'essayer Nice_r () ; il affiche les valeurs et les informations utiles (par exemple: propriétés et méthodes pour les objets) .enter image description hereAvertissement: Je l'ai écrit moi-même.

2
Christian

Une belle sortie colorée:

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

va ressembler à:

 enter image description here

la source:

<?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');
    }
}
2
rubo77

Voici une version de pp qui fonctionne aussi bien pour les objets que pour les tableaux (j'ai aussi sorti les virgules):

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
Serge Goldstein

Voici un autre vidage simple sans les frais généraux de 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
1
bob

Depuis que j'ai trouvé cela via Google, en cherchant comment formater json pour le rendre plus lisible pour le dépannage.

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

Si vous souhaitez utiliser le résultat dans d'autres fonctions, vous pouvez obtenir une expression valide PHP sous forme de chaîne à l'aide de var_export :

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

Pour beaucoup de choses que les gens font dans leurs questions, j'espère qu'ils ont dédié une fonction et ne copient pas la journalisation supplémentaire. var_export obtient une sortie similaire à var_dump dans ces situations.

1
Aram Kocharyan

Si votre serveur s’oppose à ce que vous changiez d’en-têtes (en texte brut) après que certains aient été envoyés, ou si vous ne souhaitez pas modifier votre code, uniquement "voir la source" depuis votre navigateur bloc-notes) traitera les nouvelles lignes mieux que votre navigateur, et fera basculer les choses: 

Tableau ([racine] => 1 [sub1] => Tableau () [sub2] => Tableau () [sub3] => Tableau () [sous4] => Tableau () ...

dans une représentation correctement tabulée:

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

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...
1
adamdport

En développant la réponse de @ stephen, nous avons ajouté quelques modifications très mineures à des fins d'affichage.

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

Formatera n'importe quel tableau multidimensionnel comme ceci:

enter image description here

0
Shannon Hochkins

C'est ce que j'utilise habituellement:

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

Que diriez-vous d’une seule fonction autonome nommée debug from https://github.com/hazardland/debug.php

La sortie HTML typique debug () ressemble à ceci:

 enter image description here

Mais vous pouvez aussi exporter les données sous forme de texte brut avec la même fonction (avec 4 onglets indentés) (et même le consigner dans un fichier si nécessaire):

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"
0
BIOHAZARD

Je pense que la meilleure solution pour une jolie impression JSON en php est de changer l'en-tête:

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

(Si vous utilisez text/json, de nombreux navigateurs demanderont un téléchargement ... facebook utilise text/javascript pour leur protocole graphique, donc cela ne doit pas être trop grave)

0
Grant Miller

FirePHP est un plugin firefox qui affiche une fonctionnalité de journalisation très jolie.

0
PHPst
    <?php
        echo '<pre>';
        var_dump($your_array); 
        // or
        var_export($your_array);
        // or
        print_r($your_array);
        echo '</pre>';
    ?>

Ou Utilisez des bibliothèques externes comme REF: https://github.com/digitalnature/php-ref

0
Foad Tahmasebi

J'ai créé cette fonction pour imprimer un tableau pour le débogage:

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

J'espère que ça aide, Tziuka S.

0
tziuka

Dans PHP 5.4, vous pouvez utiliser JSON_PRETTY_PRINT si vous utilisez la fonction json_encode.

json_encode(array('one', 'two', 'three'), JSON_PRETTY_PRINT);

http://php.net/manual/en/function.json-encode.php

0