Probleme de 0 avec substr

scoubydog Messages postés 10 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 8 février 2009 - 7 févr. 2009 à 18:08
scoubydog Messages postés 10 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 8 février 2009 - 8 févr. 2009 à 21:35
Bonjour, je vous explique mon probleme :
Je travaille sur un petit module qui me permet de savoir en tapant un code postal francais si c'est au nord ou au sud de la France.
Pour cela j'ai un champs qui me permet de rentrer un code postal(5 chiffres). Quand je valide, je récupère les deux premiers numéros de la valeur et je les comparent à deux listes. La première possède tous les 2 premiers chiffre des codes postaux du nord et la deuxieme le reste.

Voici mon code :
$champscodepostal = substr($champscodepostal, 0, 2);if ($champscodepostal '01' || '03' || '02' || '08' ...) {$zone 1;}elseif($champscodepostal '04' || '05' ||'07' || '09' ...) {$zone 2;}
else{$zone = 3;};

Le code fonctionne pour toutes les valeur de code postal sauf pour ceux qui commence par 0.
ex : le substr pour 09562 vaut 9 et non 09.

Merci de votre aide.

5 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
7 févr. 2009 à 19:33
Salut,

Pour commencer, ta manière de faire les if conduira toujours ton expression a être vrai au tout premier (a moins que tu n'ai ici mis un raccourcis). En effet, les chaînes '03', '02' en sont pas comparées a  $champscodepostal et sont évaluées comme tel, c'est a dire a une valeur qui est, dans le cas présent, toujours vrai.
Ceci corrigé, ton script marche très bien. Une solution beaucoup plus propre serait de te faire un tableau qui associe a chaque numéro du département (indice dont tu n'as pas a te soucier) le numéro de la zone.

Exemple pour les 4 premiers départements :
$zone_data = array(4, 3, 4, 4);
$zone = $zone_data[intval($champscodepostal) + 1];

Un tableau est indexé a partir de 0 et non de 1, d'où l'ajout de 1 lors de la recherche.
En théorie le intval() est inutile, PHP convertissant automatiquement.
0
scoubydog Messages postés 10 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 8 février 2009
7 févr. 2009 à 22:38
Je te remercie pour ta réponse.
Effectivement l'idée du tableau est beaucoup plus propre et plus simple, mais il me reste une derniere petite erreur

Voici ce que j'ai fait :
<?php
$champscodepostal=10000;
$champscodepostal2=substr($champscodepostal,0,2); pour récupérer le deux premiers chiffres.
$zone_data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ); ///different pour savoir quel valeur correspond.

$zone = $zone_data[$champscodepostal2]-1;
echo $champscodepostal2; //donne 10, parfait
echo $zone; //donne 10, parfait
?>

mais si je met un département  qui commence par un zero :
<?php

$champscodepostal=06100;

......

?>
il me met une erreur puisque l'index 06 n'existe pas.Il doit surement y avoir une astuce pour contourner ce probleme.
merci encore.
0
scoubydog Messages postés 10 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 8 février 2009
7 févr. 2009 à 22:50
oups désoler j'avais supprimé ton intval
ce qui donne :

<?php
$champscodepostal='08220';
$champscodepostal=substr($champscodepostal, 0, 2);
$champscodepostal=intval($champscodepostal);
$zone_data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 );
$zone = $zone_data[$champscodepostal]-1;
?>
réponse 8

voila j'ai plus qu'a appliquer ca a mon code
merci
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
8 févr. 2009 à 09:41
Salut,

En effet c'est bien -1 au lieux de +1 comme j'avais mis par erreur (encore une étourderie de ma part :s).

Par contre, tu as mal placé le dit -1 et tu ne semble pas avoir bien compris le principe du tableau que je voulais te montrer. Il ne faut pas mettre les numéros de départements dans le tableau mais les numéros de zone.

Si on reprend ce que j'avais mis pour les 4 premiers départements on a :
$zone_data = array(4, 3, 4, 4);
donc :
$zone_data[0] a pour valeur 4 => le département numéro 00 est dans la zone 4;
$zone_data[1] a pour valeur 3 => le département numéro 01 est dans la zone 3;
$zone_data[2] a pour valeur 4 => le département numéro 02 est dans la zone 4;
et ainsi de suite.

Bien entendu, vu qu'il n'existe pas de département 00 il faut enlever 1 pour retrouver la bonne valeur :
$champscodepostal=intval(substr($champscodepostal, 0, 2)) - 1;
Ceci te donne le numéro du département avec 1 de moins afin de se mettre a un index 0 et non 1.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scoubydog Messages postés 10 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 8 février 2009
8 févr. 2009 à 21:35
Salut,
oui pour le -1 j'ai posté trop vite mais j'avais bien fait la modif apres. Pour ce qui des valeurs du tableau c'était juste pour effectuer mes test pour aller plus vite comme ca en mettant par exemple la valeur 08220 je savais que j'allais tomber sur 8 et ainsi de suite pour mes autres test. Dans la version finale j'ai changer les valeur par 1, 2 ou 3 par rapport à mes trois zones.

Voila, merci encore.
0