Page 1 sur 1

Print_r de débugguage

Posté : 13 oct. 2007, 18:22
par Arcanis
Salut!
Il y a quelques temps, j'en avait un peu marre de devoir retaper à chaque fois que je voulais afficher le contenu d'un tableau
<?php echo '<pre>'.print_r($array,true).'</pre>'; ?>
, et avoir en plus un truc bien moche qui m'embêtait pour le parcourir.

Donc j'ai codé cette fonction, qui lit le contenu complet d'un tableau et l'affiche, avec des informations en plus (type de la variable, taille du texte pour les strings, nom de la classe pour les objets). J'y ais également mis une petite coloration syntaxique des familles pour faire plus joli (tableaux en orange, chaîne en vert, types de variables en bleu, nombres en rouge, et le reste j'ai oublié Image.
Pour le lancer, il suffit d'exécuter debug_r($array).
function debug_r($tableau,$return=false,$indent='') {
	if(is_array($tableau)) {
		$result = '<span style="font-weight: bold; color: #eb9230;">Array {'."\n";
		foreach($tableau as $clef=>$var) {
			if(is_array($var)) {
				$result.= $indent.'	<span style="font-weight: normal; color: #f00;">['.$clef.']</span> => '.debug_r($var,true,$indent.'	');
			} else {
				$stringlength = '';
				$type = gettype($var);
				if($type==='string') {
					$stringlength = '['.strlen($var).']';
					$var = '<span style="color: #4a9b2f;">"'.htmlentities($var).'"</span>';
				} elseif($type==='object') {
					$var = '<span style="color: #936d96;"><b>Class</b> '.get_class($var).'</span>';
				} else {
					$var = '<span style="color: #936d96;">'.$var.'</span>';
				}
				$result.= $indent.'	<span style="font-weight: normal; color: #f00;">['.$clef.']</span> => <span style="font-weight: normal; color: #6032b4;">'.$type.'('.$var.')'.$stringlength.'</span>,'."\n";
			}
		}
		$result.= $indent.'}</span>'."\n";
		if($indent==='') $result = '<pre style="font-family: Consolas;">'.$result.'</pre>';
		if($return===true) {
			$return = $result;
		} else {
			$return = print($result);
		}
	} else {
		echo '<br /><b>Attention : </b>La fonction debug_r() doit être lancé avec un argument de type Array (donné: '.gettype($tableau).'; contient: '.$tableau.')';
		$return = false;
	}
	return $return;
}
++!

Posté : 13 oct. 2007, 18:33
par Truc
On finit tous par en arriver la :D

(autre sujet du même type)

Posté : 13 oct. 2007, 18:39
par Sékiltoyai
Pour ma part, j'utilise le header('Content-Type: text/plain'); combiné au var_dump()… :-/

Posté : 13 oct. 2007, 19:00
par Arcanis
bon...
tant pis, j'aurais essayé Image

Posté : 14 oct. 2007, 11:37
par naholyr
Au passage j'en remets une couche, var_dump() est plus efficace que print_r() pour le débuggage (ne serait-ce que pour différencier false, null, et la chaine vide).

Et avec xdebug, on a un var_dump() colorisé, des exceptions avec des traces lisibles, etc... --> http://www.phpfrance.com/forums/voir_re ... php#207392

Posté : 17 oct. 2007, 14:12
par Genova
Arcanis apparament ne gère pas un cas de figure : la recursivité.

Essaie de faire :
$tab = array();
$tab[0] = &$tab;
debug_r($tab);
normalement tu auras une mauvaise surprise.

Personellement j'utilise :
echo '<xmp>';
print_r($tab);
echo '</xmp>';
XMP faisant office de <pre> + htmlspecialchars()