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?
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);
C’est ce que j’utilise pour imprimer mes tableaux:
<pre>
<?php
print_r($your_array);
?>
</pre>
La magie vient avec la balise pre
.
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.
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>
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.
Que diriez-vous de print_r?
N'oubliez pas de définir html_errors = on
dans php.ini pour obtenir une jolie impression de var_dump () en combinaison avec xdebug.
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.
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
||---------------------------------||
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>";
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 .
error_log(print_r($variable,true));
envoyer à syslog ou eventlog pour windows
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)));
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;
}
?>
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) .Avertissement: Je l'ai écrit moi-même.
Une belle sortie colorée:
echo svar_dump (tableau ("a", "b" => "2", "c" => tableau ("d", "e" => tableau ("f", "g")).););
va ressembler à:
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(" "," ",$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');
}
}
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;
}
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
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 );
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.
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
(
)...
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:
C'est ce que j'utilise habituellement:
$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";
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:
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"
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)
FirePHP est un plugin firefox qui affiche une fonctionnalité de journalisation très jolie.
<?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
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.
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);