Print_r de débugguage

Eléphant du PHP | 99 Messages

13 oct. 2007, 18:22

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;
}
++!
Modifié en dernier par Arcanis le 13 oct. 2007, 19:00, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 oct. 2007, 18:33

On finit tous par en arriver la :D

(autre sujet du même type)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 5924 Messages

13 oct. 2007, 18:39

Pour ma part, j'utilise le header('Content-Type: text/plain'); combiné au var_dump()… :-/

Eléphant du PHP | 99 Messages

13 oct. 2007, 19:00

bon...
tant pis, j'aurais essayé Image

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

14 oct. 2007, 11:37

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

ViPHP
ViPHP | 928 Messages

17 oct. 2007, 14:12

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()