Print_r like

Print_r like - PHP - Programmation

Marsh Posté le 11-11-2008 à 23:58:27    

Bonjour à tous !
 
Pour les besoins d'un tuto, je voulais faire un print_r qui soit joli (une sorte de coloration syntaxique), j'ai presque réussit, seulement il semblerais que print_r affiche des choses que je n'ai pas avec foreach...
 
Petit exemple :

//Ma fonction affiche :  
    [prenom] => Prenom de l'utilisateur
    [numeros] => SimpleXMLElement Object
        (
            [numero] => 0102030405
            [numero] => 0212345678
        )
//Alors que print_r affiche :  
    [prenom] => Prenom de l'utilisateur
    [numeros] => SimpleXMLElement Object
        (
            [numero] => Array
                (
                    [0] => 0102030405
                    [1] => 0212345678
                )
 
        )


Print_r m'affiche aussit defois un [@attribute] alors que ma fonction ne les affiche jamais.
Quelqu'un aurais une idée ?
 
PS : Mon but et d'obtenir un print_r coloré, si quelqu'un connais un autre solution, mais je doit garder la forme du print_r pour ne pas dérouter les lecteurs.
 
Merci d'avance pour vos réponses !

Reply

Marsh Posté le 11-11-2008 à 23:58:27   

Reply

Marsh Posté le 12-11-2008 à 07:58:46    

pour le tableau tu dois avoir un test si c'est un array (is_array)
donc en faite tu recupere son indice et valeur avec un foreach au lieu de recupere sa valeur ceux qui te donnera la meme chose
 
soit  
 
foreach($maval as $id=>$val){
 
}


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 12-11-2008 à 08:27:34    

Merci pour ta réponse, mais
 
je fait déjà comme ça, c'est juste que print_r semble rajouter des clefs quand on a deux fois la même clef (courant pour du XML).
 
Je vous colle mon code, comme ça si il y en a qui veulent l'utiliser, il fonctionne déja trés bien, mais la différence avec print_r me dérange encore :

function debug_r($var, $print=true, $tab='') {
  $str = '';
  if(is_array($var) || is_object($var)) {
   if(count($var)>0 || (string)$var==''){
    $str .= '<span style="color:#DD0047">';
    if(is_array($var)){
     $str .= 'Array';
    }else if(is_object($var)){
     $str .= get_class($var).' Object';
    }
    $str .= "</span>\n".$tab."(\n";
     
    foreach($var as $k => $v){
     $str .= $tab."    [<strong>$k</strong>] => ".debug_r($v, false, $tab.'        ')."\n";
    }
    $str .= $tab." )";
   }else{
    $str = '<span style="color:#4a9b2f">'.(string)$var.'</span>';
   }
  } else {
   if(is_string($var)) {
    $str = '<span style="color:#4a9b2f">"'.htmlentities($var).'"</span>';
   } else {
    $str = '<span style="color:#936d96">'.$var.'</span>';
   }
  }
  if($print)
   echo $str;
  else
   return $str;
 }


 
Je pense que le bug peut venir du fait que l'objet SimpleXMLElement contient des fonctions pour guider foreach, et donc nous "caches" certains paramètres...
Si quelqu'un connai un moyen d'obtenir la même chose que print_r je suis trés preneur.


Message édité par korrigan33 le 12-11-2008 à 08:29:34
Reply

Marsh Posté le 12-11-2008 à 10:34:41    

regarde cela
http://www.php.net/SimpleXML
et prend les fonction que tu as besoin le type simpleXML est assez particulier
Je l'utilise tous les jours


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 12-11-2008 à 10:38:42    

Bonjour, merci pour la réponse.
 
Je connais bien SimpleXML, je rédige le tuto sur ça justement, mais le probleme ne vien pas forcément de SimpleXML, je voudrais une fonction qui affiche exactement la même chose que print_r.
 
Et que même pour les classe "spéciales" comme SimpleXML, je me retrouve avec la même chose mais coloré...
 
Voila, je sait pas si c'est possible...

Reply

Marsh Posté le 12-11-2008 à 10:41:44    

creér une variable $i avant le parcours de cette object xml et incrémente sa valeur a chaque passage et écrit sa valeur en id de la valeur du tableau ceci reprendra le meme principe que pour print_r


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 12-11-2008 à 12:27:43    

Code :
  1. echo str_replace('<span style="color: #0000BB">&lt;?&nbsp;</span>','',highlight_string('<? '.var_export($test,true),true));


 


Message édité par CAJAX le 12-11-2008 à 12:36:12
Reply

Marsh Posté le 12-11-2008 à 13:44:36    

Bonjour CAJAX,
 
Merci pour ta réponse, mais essaye de lire ce que j'ai écrit...
 
Je veux un résultat identique a print_r, ce qui n'est pas le clas avec var_export, et highlight_string ne fonctionne pas avec print_r, n'en reconnaissant pas la syntaxe...
 
Je croie que je vais finir par refaire une fonction du genre de highlight_string, mais qui parse un print_r, si j'avais pu éviter ça aurais était pamal...
 
Si vous voyez une solution...

Reply

Marsh Posté le 12-11-2008 à 15:04:21    

Mmm.. Je ferais cela avec les expressions régulières..

Reply

Marsh Posté le 12-11-2008 à 15:10:20    

Oui je croie que c'est finalement la solution la plus simple aussi j'ai pondu la solution suivante :

 


 function print_r_highlighted($var, $return = false){
  $str = print_r($var, true);
 
  if($return===true)
   return highlight_print_r($str, true);
  else
   highlight_print_r($str);
 }
 function highlight_print_r($str, $return = false){
 
  $search = array(
   "/\[(@?\w*)] => (\w+ Object|Array)/",
   "/\[(@?\w*)] => (.*)/",
   "/(\w+ Object|Array)(\n\s*\()/",
   "/([\[\]\(\)]|=> )/"
  );
  $replace = array(
   "[<span style=\"color:#01B\">$1</span>] => <span style=\"color:#01B\">$2</span>",
   "[<span style=\"color:#01B\">$1</span>] => <span style=\"color:#c22710\">$2</span>",
   "<span style=\"color:#c22710\">$1</span>$2",
   "<span style=\"color:#070\">$1</span>"
  );
 
  $str = preg_replace($search, $replace, $str);
 
  if($return===true){
   return $str;
  }else{
   echo $str;
  }
 }

 

La premiere permet d'appeler la deuxième avec une variable en argument, la deuxième permet de colorer le résultat d'un print_r.

 

J'ai utiliser le paramètre $return pour calquer le fonctionnement de print_r et highlight_string

 

Merci a tous pour vos réponses, et bonne journée !


Message édité par korrigan33 le 12-11-2008 à 15:10:58
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed