switch qui délire

Petit nouveau ! | 8 Messages

06 mai 2014, 15:27

Bonjour,
Je suis tombé sur un tour de magie que me fait PHP.
Je vous explique, c'est simple : j'ai "créé" une carte qui affiche toutes les caches que j'ai trouvé. (geocaching.com pour ceux qui connaissent) , bref.
Voici ce que ça rend : http://blog.corneliux.fr/php/geocaching ... neliux.php

Je traite une variable avec un switch qui va afficher une image en fonction de son nom.
Tout se passe bien, sauf pour une image (enfin, pour 2 , mais c'est le même problème).
Pour la cache "Sacré cailloux" qui est un icone "tick" vert (sous le ? bleu ), ça devrait être l'icone d'une Earthcache !!!

Voici le code qui pose problème :

Code : Tout sélectionner

// On cherche si c'est la ligne du type de cache pour le logo if (preg_match("#<type>#i", "'.$buffer.'")){ //echo $buffer; //unset($tab_ico); //unset($tab_icone); $tab_ico = explode('|',$buffer); $tab_icone = explode(' ',$tab_ico[1]); // echo "Longitude : ".$tab_coord[1]." Lattitude : ".$tab_coord[3]."<br>"; $tablo_icone[$l] = "images/"; echo "tab_icone : ".$tab_icone[0]."<br>"; switch ($tab_icone[0]){ case Traditional: $tablo_icone[$l] .= "Traditional.png"; // $test[$l] = "Traditional.png"; break; case Cache: $tablo_icone[$l] .= "Cito.png"; break; case Letterbox: $tablo_icone[$l] .= "Letterbox.png"; break; case Virtual: $tablo_icone[$l] .= "Virtual.png"; break; case Unknown: $tablo_icone[$l] .= "Unknown.png"; break; case Virtual: $tablo_icone[$l] .= "Virtual.png"; break; case Wherigo: $tablo_icone[$l] .= "Wherigo.png"; break; case Webcam: $tablo_icone[$l] .= "Webcam.png"; break; case Event: $tablo_icone[$l] .= "Event.png"; break; case Earthcache: $tablo_icone[$l] .= "Earthcache.png"; break; case Multi-cache: $tablo_icone[$l] .= "Multi-cache.png"; break; case Mega-Event: $tablo_icone[$l] .= "Mega-Event.png"; break; default : $tablo_icone[$l] .= "found.png"; }
Le problème ne survient que pour la Eartcache qui affiche l'image "defaut.png" au lieu d'afficher l'image "Earthcache.png".
Comme vous pouvez le voir, j'ai fait un echo de ce qui se passe dans le swicth, et il voit bien la Earthcache puisque sur 2 lignes différentes, j'ai : tab_icone : Earthcache , tandis que pour les multi, j'ai bien tab_icone : Multi-cache.

Tout le reste de mon script fonctionne, mais ça, je ne comprend vraiment pas... Quelqu'un peut me donner une piste, svp...
Merci d'avance.

ViPHP
xTG
ViPHP | 7331 Messages

06 mai 2014, 17:17

Déjà j'ai un sacré doute sur ton utilisation des case.
case Traditional:
Pour moi Traditional est une constante et non une chaîne de caractère.
Mais après je peux me tromper, je fais du C à longueur de journée.

As-tu essayé de faire :
var_dump($tab_icone[0]);
Ce afin de vérifier la longueur de la chaîne de caractère de la chaîne qui pose problème ( => caractère non imprimable, espace en trop, ect).

Petit nouveau ! | 8 Messages

06 mai 2014, 18:12

Bingo, je crois que tu as fait mouche sur d'ou vient le problème.
Un var_dump($tab_icone[0]); me renvoie :

Code : Tout sélectionner

string(19) "Earthcache "
Il y aurait donc 19 caractères, mais moi, je n'en vois que 11 !
Maintenant, je ne suis pas beaucoup plus avancé, mais je sais ou chercher.
Merci de ton aide, et si par hasard, tu as une solution, là encore, elle sera la bienvenue.

ViPHP
xTG
ViPHP | 7331 Messages

06 mai 2014, 18:30

La solution est de corriger la donnée d'origine en supprimant ces caractères non imprimables. ;)
Ou bien si tu n'as pas la maîtrise sur les données en entrée il te faut supprimer les caractères non voulus avec un str_replace().

Petit nouveau ! | 8 Messages

06 mai 2014, 18:57

Non, je n'ai pas accès aux données en entrée. Enfin, si, je pourrais, mais comme c'est une fonctionnalité qui peut être utilisé par tous : http://blog.corneliux.fr/index.php/geoc ... otre-carte , ça restreint la convivialité si on doit bidouiller dans le fichier source.
Bon, ben, merci en tout cas. Je vais me plonger la dedans.
Modifié en dernier par corneliux le 06 mai 2014, 19:13, modifié 1 fois.

Petit nouveau ! | 8 Messages

06 mai 2014, 19:10

Bon, voici la solution au cas ou d'autres personnes auraient un jour le même problème. J'ai fait un test pour savoir s'il y avait la chaine "Earthcache" dans "Earthcache " <-- l'espace est important !

Code : Tout sélectionner

if (preg_match("/Earthcache/i", $tab_icone[0] )){ $tab_icone[0] = "Earthcache"; }
Merci encore à xTG de m'avoir aiguillé.

Tu disais :
Déjà j'ai un sacré doute sur ton utilisation des case.
à cause des guillemets ? Parce que je les avait mis pour voir si ça changeait quelque chose.

Eléphant du PHP | 343 Messages

06 mai 2014, 20:03

Il y a aussi la fonction rtrim => http://www.php.net/manual/fr/function.rtrim.php pour supprimer les espaces à droite ;)
Développeur web

ViPHP
ViPHP | 4039 Messages

07 mai 2014, 10:20

'ai fait un test pour savoir s'il y avait la chaine "Earthcache" dans "Earthcache " <-- l'espace est important !
strpos() est tout aussi indiqué (et marginalement plus rapide)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.