Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RECHERCHE DES VILLES ET CODES POSTAUX FRANÇAIS


Information sur la source

Catégorie :Chaîne de caratère Classé sous : ajax, villes, codes, postaux, recherche Niveau : Initié Date de création : 07/03/2006 Date de mise à jour : 25/04/2006 13:58:27 Vu / téléchargé: 15 300 / 2 047

Note :
9 / 10 - par 4 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (36)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Une source très simple, mais qui peut sans doute être utile!
J'ai un fichier possèdant toutes les villes françaises, et leur code postal (si si!).
J'utilise cette petite classe pour proposer une recherche : on peut taper un nom de ville, un code postal, voire juste un bout d'un des deux.
Via la méthoe Ajax, le script ressort une liste cliquable des résultats de la recherche.
Bref, tapez 75, et vous aurez toutes les villes dont le code postal commence par 75...vous pourrez cliquer sur un code postal ou une ville de cette liste pour la faire entrer dans le champ de saisie.

En soi, comme ça, tout seul, ça ne sert à rien. Mais cd'est très utile, croyez-moi, après intégration dans un projet :-)

A vous de l'intégrer (c'est relativement facile).
 

Source

  • <?php
  • class ocity {
  • /**
  • * private array aNomVilles, aCpVilles, aSoundexVilles, aPhonexVilles : data arrays
  • */
  • private $aNomVilles = array ();
  • private $aCpVilles = array ();
  • private $aSoundexVilles = array ();
  • private $aPhonexVilles = array ();
  • /**
  • * public static string sResult : string used to store the result of the query
  • */
  • private $sResult = '';
  • /**
  • * public static string sSearch : string used to store the query
  • */
  • private static $sSearch = '';
  • private static $_post = '';
  • private $oSoundex;
  • private $oPhonex;
  • /**
  • * public function __construct
  • * constructor
  • * @Param string dataFile : data filename.
  • */
  • public function __construct ($dataFile = 'data.dat', $soundex, $phonex) {
  • $this -> oSoundex = $soundex;
  • $this -> oPhonex = $phonex;
  • $aLines = file ($dataFile);
  • foreach ($aLines as $line) {
  • $aWord = explode (';', $line);
  • $this -> aCpVilles[] = $aWord[0];
  • $this -> aNomVilles[] = $aWord[1];
  • $this -> aSoundexVilles[] = $aWord[2];
  • $this -> aPhonexVilles[] = $aWord[3];
  • }
  • }
  • /**
  • * callback public static function getFirst
  • * returns an array with the results of the query
  • * @Returns array
  • */
  • private static function getFirst ($val) {
  • return (substr ($val, 0, strlen (self::$sSearch)) === self::$sSearch);
  • }
  • private static function mapLev ($val) {
  • return levenshtein (self::$_post, $val);
  • }
  • /**
  • * public function getSearch
  • * returns the string result, called by the xmlhttp method
  • * @Returns string sResult
  • */
  • public function getSearch () {
  • if (isset ($_POST['data']) && '' !== trim ($_POST['data'])) {
  • self::$sSearch = strtolower ($_POST['data']);
  • if ($_POST['type'] === '0') {
  • if (self::$sSearch === '*') {
  • $aTmp = array_combine ($this -> aCpVilles, $this -> aNomVilles);
  • if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '2'))) {
  • ksort ($aTmp);
  • } else {
  • asort ($aTmp);
  • }
  • $aTmp = array_combine ($this -> aCpVilles, $this -> aNomVilles);
  • }
  • elseif (is_numeric (self::$sSearch)) {
  • $aTmp = array_filter ($this -> aCpVilles, array ('self', 'getFirst'));
  • if (!empty ($aTmp)) {
  • $aTmp = array_combine ($aTmp, array_intersect_key ($this -> aNomVilles, $aTmp));
  • if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '1'))) {
  • ksort ($aTmp);
  • } else {
  • asort ($aTmp);
  • }
  • } else {
  • $aTmp = array ();
  • }
  • } else {
  • $aTmp = array_filter ($this -> aNomVilles, array ('self', 'getFirst'));
  • if (!empty ($aTmp)) {
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aTmp), $aTmp);
  • if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '2'))) {
  • asort ($aTmp);
  • } else {
  • ksort ($aTmp);
  • }
  • } else {
  • $aTmp = array ();
  • }
  • }
  • } elseif ($_POST['type'] === '1') {
  • if (!is_numeric (self::$sSearch)) {
  • $this -> oSoundex -> build (self::$sSearch);
  • self::$sSearch = $this -> oSoundex -> sString;
  • self::$_post = strtolower ($_POST['data']);
  • $aDump = array_filter ($this -> aSoundexVilles, array ('self', 'getFirst'));
  • $aVilles = array_intersect_key ($this -> aNomVilles, $aDump);
  • if (isset ($_POST['sort']) && $_POST['sort'] === '2') {
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • asort ($aTmp);
  • } elseif (isset ($_POST['sort']) && $_POST['sort'] === '1') {
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • ksort ($aTmp);
  • } else {
  • $aLev = array_map (array ('self', 'mapLev'), $aVilles);
  • if (!empty ($aLev) && !empty ($aVilles)) {
  • array_multisort ($aLev, $aVilles);
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • } else {
  • $aTmp = array ();
  • }
  • }
  • }
  • } else {
  • if (!is_numeric (self::$sSearch)) {
  • $this -> oPhonex -> build (self::$sSearch);
  • self::$sSearch = $this -> oPhonex -> sString;
  • self::$_post = strtolower ($_POST['data']);
  • $aDump = array_filter ($this -> aPhonexVilles, array ('self', 'getFirst'));
  • $aVilles = array_intersect_key ($this -> aNomVilles, $aDump);
  • if (isset ($_POST['sort']) && $_POST['sort'] === '2') {
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • asort ($aTmp);
  • } elseif (isset ($_POST['sort']) && $_POST['sort'] === '1') {
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • ksort ($aTmp);
  • } else {
  • $aLev = array_map (array ('self', 'mapLev'), $aVilles);
  • if (!empty ($aLev) && !empty ($aVilles)) {
  • array_multisort ($aLev, $aVilles);
  • $aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
  • } else {
  • $aTmp = array ();
  • }
  • }
  • }
  • }
  • $iCpt = 0;
  • $this -> sResult .= '<div style="border: 1px solid #000000;width: 250px;background-color: #ffffff;"><span title="Trier par code postal" onclick="search (\''.$_POST['data'].'\',1, '.$_POST['type'].');" style="cursor: pointer; margin: 5px;font-weight: bold;text-align: left;width: 100px;">Code </span><span title="Trier par ville" onclick="search (\''.$_POST['data'].'\',2, '.$_POST['type'].');" style="width: 150px;cursor: pointer; margin: 5px;font-weight: bold; text-align: right;">Ville</span></div>';
  • foreach ($aTmp as $cp => $ville) {
  • $sColor = ($iCpt%2 === 0)?'background-color: #cccccc;':'background-color: #ffffff;';
  • $this -> sResult .= '<div style="border: 1px solid #000000;width: 250px;'.$sColor.'"><span onclick="document.getElementById(\'mySearch\').value = this.innerHTML;" style="cursor: pointer; margin: 5px;'.$sColor.'">'.$cp.'</span><span onclick="document.getElementById(\'mySearch\').value = this.innerHTML;" style="cursor: pointer; margin: 5px;'.$sColor.'">'.$ville.'</span></div>';
  • $iCpt ++;
  • }
  • echo $this -> sResult;
  • } else {
  • return false;
  • }
  • }
  • }
  • ?>
<?php
class ocity {
	/**
	* private array aNomVilles, aCpVilles, aSoundexVilles, aPhonexVilles : data arrays
	*/
	private $aNomVilles = array ();
	private $aCpVilles = array ();
	private $aSoundexVilles = array ();
	private $aPhonexVilles = array ();
	/**
	* public static string sResult : string used to store the result of the query
	*/
	private $sResult = '';

	/**
	* public static string sSearch : string used to store the query
	*/
	private static $sSearch = '';
	private static $_post = '';

	private $oSoundex;
	private $oPhonex;
	/**
	* public function __construct
	* constructor
	* @Param string dataFile : data filename.
	*/
	public function __construct ($dataFile = 'data.dat', $soundex, $phonex) {
		$this -> oSoundex = $soundex;
		$this -> oPhonex = $phonex;
		$aLines = file ($dataFile);
		foreach ($aLines as $line) {
			$aWord = explode (';', $line);
			$this -> aCpVilles[] = $aWord[0];
			$this -> aNomVilles[] = $aWord[1];
			$this -> aSoundexVilles[] = $aWord[2];
			$this -> aPhonexVilles[] = $aWord[3];
		}
	}

	/**
	* callback public static function getFirst
	* returns an array with the results of the query
	* @Returns array
	*/
	private static function getFirst ($val) {
		return (substr ($val, 0, strlen (self::$sSearch)) === self::$sSearch);
	}

	private static function mapLev ($val) {
		return levenshtein (self::$_post, $val);
	}

	/**
	* public function getSearch
	* returns the string result, called by the xmlhttp method
	* @Returns string sResult
	*/
	public function getSearch () {
		if (isset ($_POST['data']) && '' !== trim ($_POST['data'])) {
			self::$sSearch = strtolower ($_POST['data']);
			if ($_POST['type'] === '0') {
				if (self::$sSearch === '*') {
					$aTmp = array_combine ($this -> aCpVilles, $this -> aNomVilles);
					if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '2'))) {
						ksort ($aTmp);
					} else {
						asort ($aTmp);
					}
				$aTmp = array_combine ($this -> aCpVilles, $this -> aNomVilles);
				}
				elseif (is_numeric (self::$sSearch)) {
					$aTmp = array_filter ($this -> aCpVilles, array ('self', 'getFirst'));
					if (!empty ($aTmp)) {
						$aTmp = array_combine ($aTmp, array_intersect_key ($this -> aNomVilles, $aTmp));
						if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '1'))) {
							ksort ($aTmp);
						} else {
							asort ($aTmp);
						}
					} else {
						$aTmp = array ();
					}
				} else {
					$aTmp = array_filter ($this -> aNomVilles, array ('self', 'getFirst'));
					if (!empty ($aTmp)) {
						$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aTmp), $aTmp);
						if (isset ($_POST['sort']) && in_array ($_POST['sort'], array ('0', '2'))) {
							asort ($aTmp);
						} else {
							ksort ($aTmp);
						}
					} else {
						$aTmp = array ();
					}
				}
			} elseif ($_POST['type'] === '1') {
				if (!is_numeric (self::$sSearch)) {
					$this -> oSoundex -> build (self::$sSearch);
					self::$sSearch = $this -> oSoundex -> sString;
					self::$_post = strtolower ($_POST['data']);
					$aDump = array_filter ($this -> aSoundexVilles, array ('self', 'getFirst'));
					$aVilles = array_intersect_key ($this -> aNomVilles, $aDump);
					if (isset ($_POST['sort']) && $_POST['sort'] === '2') {
						$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						asort ($aTmp);
					} elseif (isset ($_POST['sort']) && $_POST['sort'] === '1')  {
						$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						ksort ($aTmp);
					} else {
						$aLev = array_map (array ('self', 'mapLev'), $aVilles);
						if (!empty ($aLev) && !empty ($aVilles)) {
							array_multisort ($aLev, $aVilles);
							$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						} else {
							$aTmp = array ();
						}
					}
				}
			} else {
				if (!is_numeric (self::$sSearch)) {
					$this -> oPhonex -> build (self::$sSearch);
					self::$sSearch = $this -> oPhonex -> sString;
					self::$_post = strtolower ($_POST['data']);
					$aDump = array_filter ($this -> aPhonexVilles, array ('self', 'getFirst'));
					$aVilles = array_intersect_key ($this -> aNomVilles, $aDump);
					if (isset ($_POST['sort']) && $_POST['sort'] === '2') {
						$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						asort ($aTmp);
					} elseif (isset ($_POST['sort']) && $_POST['sort'] === '1')  {
						$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						ksort ($aTmp);
					} else {
						$aLev = array_map (array ('self', 'mapLev'), $aVilles);
						if (!empty ($aLev) && !empty ($aVilles)) {
							array_multisort ($aLev, $aVilles);
							$aTmp = array_combine (array_intersect_key ($this -> aCpVilles, $aDump), $aVilles);
						} else {
							$aTmp = array ();
						}
					}
				}
			}
			$iCpt = 0;
			$this -> sResult .= '<div style="border: 1px solid #000000;width: 250px;background-color: #ffffff;"><span title="Trier par code postal" onclick="search (\''.$_POST['data'].'\',1, '.$_POST['type'].');" style="cursor: pointer; margin: 5px;font-weight: bold;text-align: left;width: 100px;">Code </span><span title="Trier par ville" onclick="search (\''.$_POST['data'].'\',2, '.$_POST['type'].');" style="width: 150px;cursor: pointer; margin: 5px;font-weight: bold; text-align: right;">Ville</span></div>';
			foreach ($aTmp as $cp => $ville) {
				$sColor = ($iCpt%2 === 0)?'background-color: #cccccc;':'background-color: #ffffff;';
				$this -> sResult .= '<div style="border: 1px solid #000000;width: 250px;'.$sColor.'"><span onclick="document.getElementById(\'mySearch\').value = this.innerHTML;" style="cursor: pointer; margin: 5px;'.$sColor.'">'.$cp.'</span><span onclick="document.getElementById(\'mySearch\').value = this.innerHTML;" style="cursor: pointer; margin: 5px;'.$sColor.'">'.$ville.'</span></div>';
				$iCpt ++;
			}
			echo $this -> sResult;
		} else {
			return false;
		}
	}
}
?>

Conclusion

Je mets juste le code de la classe ocity.
Le reste est dans le zip :-)

A NOTER : la clef phonex a été calculée avec une valeur pour les type float de 12. Si votre php.ini montre quelquechose de diifférent :
precision    =  12
veuillez régénérer le fichier data.dat
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

08 mars 2006 09:52:40 :
mise à jour, quelques modifications pour avoir un code plus correct, et quelques modifications pour avoir une application plus complète :-)
08 mars 2006 15:29:03 :
ajout d'une possibilité de trier, par ville, par code postal, une fois une liste affichée. Ajout aussi du joker : si on saisit *, toute la liste des villes françaises avec leur code postal s'affiche (attention, il y en a 40000...c'est un peu long ;-) )
09 mars 2006 10:13:12 :
quelques optimisations ! Notamment au niveau d'Ajax : je ne réaffiche pas toute la page, mais uniquement le résultat de la requête.
09 mars 2006 10:22:13 :
Modification : le script est désormais disponible en versions PHP5 et PHP4. Il suffit de changer les includes dans la page index.php comme indiqué.
09 mars 2006 13:11:28 :
Nouvelle modification : j'ai remis le '' !== trim ($_POST['data']) pour une raison simple : '0' est considéré comme vide par la fonction empty : empty ('0') retourne donc true...ce que je ne veux surtout pas!
10 mars 2006 13:55:32 :
Ajout de la doc, générée par ClassFuncDoc
15 mars 2006 09:25:14 :
J'ai enlevé un bug sur php4.
17 mars 2006 12:11:24 :
Ajout (uniquement php5 pour le moment, je ferai la version php4 après) de la recherche phonex, et soundex2 avec tri par pertinence. Dans 'villes/'. L'ancienne version est tjrs là, dans 'villes_normal/'.
17 mars 2006 12:44:26 :
Ajout version PHP4
17 mars 2006 15:26:55 :
correction d'un bug en php4, et mise à jour du fichier des villes et codes postaux
17 mars 2006 16:54:19 :
Correction d'un bug en cas de recherche infructueuse sur la nouvelle version.
25 avril 2006 13:58:27 :
Modifications pour prendre en compte le cas où différentes villes ont le même code postal.

Commentaires et avis

signaler à un administrateur
Commentaire de FhX le 07/03/2006 19:04:54

http://www.codes-php.net/source-31--php5recherche-des-villes-et-codes-postaux-francais.php


J'aurais mis getFirst en statique moi étant donné que c'est une méthode de callback :)

"array_filter() retourne un tableau contenant les éléments du tableau input, filtrés grâce à la fonction callback. Si input est un tableau associatif, les clés sont préservées."
Donc plus besoin du  if(is_array($aTmp))  dans ta méthode getSearch() :)

"&& '' !== trim ($_POST['data']))" rhoo t'as pas honte ?? ;)
if ( isset($_POST['data']) && !empty(trim($_POST['data'])) ) { // }

" $this -> sSearch = strtolower ($_POST['data']); "
T'as oublié de définir sSearch dans tes propriétés ;)


Pas mal pas mal sinon :)

signaler à un administrateur
Commentaire de malalam le 07/03/2006 19:28:03 administrateur CS

Lol, heu...bon :

pour le static, t'as raison, j'y ai pas pensé.
Pour le is_array (), c'est un reste d'une autre manière de faire lol. Je l'enlèverai ouai.
Pour le trim...heu...mea culpa, mauvaise habitude prise parce que mon boss veut faire ça comme ça, même si je lui ai proubé que c'était con lol.
Exact pour $sSearch, tien.
Marci sinon :-)
Je ferai quelques modifs demain.

;-)

signaler à un administrateur
Commentaire de opossum_farceur le 15/03/2006 01:50:27

Etant novice en matière d'AJAX et complètement ignorant en matière d'XML, je soumets à ta perspicacité les messages affichés après avoir tapé 75 comme tu l'expliques dans ta présentation.

Warning: array_filter(): The second argument, 'self::getFirst', should be a valid callback in ..\php4\ocity.cls.php on line 57

Warning: array_flip(): The argument should be an array in ..\php4\ocity.cls.php on line 58

Warning: ksort() expects parameter 1 to be array, boolean given in ..\php4\ocity.cls.php on line 60

Warning: Invalid argument supplied for foreach() in ..\php4\ocity.cls.php on line 74

Sachant que j'ai fait le nécessaire dans Index.php pour que ton code fonctionne avec php4, que la version du code est celle du 13/03/2006 à 20h, et que, en dehors des warnings indiqués plus-haut ne s'affiche qu'un cadre avec dedans marqué "Code" et
"Ville", tu auras je pense en ta possession les éléments pour solutionner cette misérable broutille.
Mieux vaut un qui sait que dix qui cherchent.
Amicalement.

signaler à un administrateur
Commentaire de malalam le 15/03/2006 07:38:45 administrateur CS

trop tôt...lol.
J'ai testé ma version php4 avec un serveur en php5, alors je me suis peut-être manqué, et j'ai mon idée du pourquoi...
Je te donnerai un test à faire (des modifications) dans la journée :-)
Je pense qu'on a un problème avec la méthode callback.

signaler à un administrateur
Commentaire de malalam le 15/03/2006 07:54:25 administrateur CS

Ben en fait...suis con.
ici :
$aTmp = array_filter (array_flip ($this -> aVilles), array ('self', 'getFirst'));
et ici :
$aTmp = array_filter ($this -> aVilles, array ('self', 'getFirst'));
remplace le
array ('self', 'getFirst')
par
array ($this, 'getFirst')

signaler à un administrateur
Commentaire de opossum_farceur le 15/03/2006 21:32:17

Bien vu l'artiste!, j'ai fait les modifs indiquées et tout fonctionne à présent conformément à ta description.
Je voudrai signaler un petit désagrément imputable à la variable "short_open_tag" de php.ini, quand celle-ci est à "on" (EasyPhp par défaut, Free, etc...) : concrètement çà revient à assimiler <? au tag d'ouverture du code php.
Or, au début de "index.php" on a :
<?xml version="1.0" encoding="UTF-8"?>
très bon code s'il en est, mais source de plantage s'il est considéré comme du php.
Une solution immédiate consiste à transférer ce code à l'intérieur des balises php sous la forme :
echo "<?xml version='1.0' encoding='UTF-8'?>";
Ceci-dit, celà ne dispense pas de mettre "short_open_tag" à "off" (quand c'est possible) et de commencer le php par <?php
Amicalement.

signaler à un administrateur
Commentaire de malalam le 16/03/2006 07:37:03 administrateur CS

Oui, je sais. Je devrais peut-être le préciser.
Très honnêtement, la plupart de mes codes prennent en compte que short_open_tag est à Off, register_globals à Off, et autres broutilles du genre ;-) Sans se soucier d'un autre réglage.
J'aimerais bien, vraiment, que les développeurs de PHP virent enfin ce short tag incompatible avec la norme XHTML.

Merci, sinon :-)

signaler à un administrateur
Commentaire de opossum_farceur le 17/03/2006 00:40:21

Je vois que t'as mis la doc en Allemand et en Anglais : il ne te reste donc plus qu'à trouver la liste des codes postaux d'Allemagne et d'Angleterre !
Tout çà pour te dire que mettre en ligne une multitude de fichiers c'est prendre le risque de faire fuir d'éventuels "clients" qui vont se dire : encore une appli monstrueuse qui veut en mettre plein la vue mais qui va planter à la première occasion !
J'ai pas noté ton code vu que je ne l'ai pas vraiment étudié (n'ayant pas tous les éléments pour le faire).
Je viens de télécharger tout un tas de tutoriaux sur XML, ce n'est donc que partie remise.
Amicalement.

signaler à un administrateur
Commentaire de malalam le 17/03/2006 09:14:49 administrateur CS

Bah en fait, le code peut très bien être utilisé pour la plupart des pays, oui. Mais bon, je ne vais pas fournir la liste à chaque fois lol.
La doc, c'est une erreur de ma part si j'ai mis les versions anglaises et allemandes, je vais les virer, elles n'ont rien à faire sur cs, site français.
Tu as raison su le fait qu'un code en apparence énorme peut faire peur...ne même temps, je ne le vends pas, ce code, je le donne, alors si il ne marche pas spécialement, je m'en tape un peu lol ;-)
Et puis quoi, je suis malalam, les utilisateurs de CS me connaissent, ils savent à quel point je fais de bons codes ;-) (je plaisante hein).
Et puis pour être honnête, c'est un peu pour faire connaître ClassFuncDoc, mon outil de génération de documentations. Je ne le vends pas non plus, mais j'y ai passé du temps (j'en passe encore), je pense que c'est réellement une bonne appli, et là, ça me ferait plaisir que les gens l'apprécient et l'utilisent, par contre :-)

Je vais faire un ajout à ce code, aujourd'hui si j'ai le temps. Je vais rajouter 2 types de recherche (ce qui fait que le code va s'allonger lol, mais comme je vais virer les docs non françaises...ça équilibrera ;-) ). Je vais ajouter, donc, les recherches soundex2 et phonex, pour mettre en application mes 2 derniers codes : soundex2 et phonex...(je sais, c'est orioginal lol). Bref, des recherches phonétiques, que je vais coupler à Levenshtein pour avoir un tri par pertinence.
Enfin, vous verrez, pour ceux qui testeront ;-)

signaler à un administrateur
Commentaire de malalam le 17/03/2006 11:34:55 administrateur CS

Voilà, c'est fait, l'ajout est là.
J'ai laissé l'ancienne version, dans le répertoire 'villes_normal'.
L'autre s'appelle 'ville' et intègre donc les recherches soundex2, phonex et le tri par pertinence.
Attention, c'est plus lent!

signaler à un administrateur
Commentaire de FhX le 20/03/2006 20:50:33

"Et puis quoi, je suis malalam, les utilisateurs de CS me connaissent, ils savent à quel point je fais de bons codes ;-) (je plaisante hein)."


Ouais c'est vite dit ca :D




Ah ah ah :p :p :p

signaler à un administrateur
Commentaire de malalam le 21/03/2006 19:15:12 administrateur CS

Si on ne peut plus se vanter, en déguisant ça en plaisanterie, sans que ce soit découvert, où va-t-on... ;-)

signaler à un administrateur
Commentaire de opossum_farceur le 13/04/2006 01:07:02

J'ai un peu tardé à revenir dans le forum, mais j'étais parti dans l'étude de XML, ce qui d'ailleurs ne m'a pas été d'un grand secours pour comprendre ton code, vu que tu n'utilises pas ce format pour stocker les données.

Un gros soucis : ton fichier de données "data.dat" est incomplet.
En effet, dans les campagnes, il arrive souvent que des villages appartenant au même secteur géographique aient le même code postal (pour des raisons d'ailleurs que j'ignore mais on peut demander pourquoi au facteur et pourquoi aussi le dernier chiffre du code est toujours 0, çà supprime des possibilités de codage, mais bon, on n'est pas là pour réformer l'administation, bref).
Ton fichier exprime donc une vision réductrice de la réalité en associant à chaque code une ville et une seule (inversement, à une ville peut correspondre plusieurs codes, mais çà, on s'en fiche).
Et toi tu exploites cette propriété pour établir ton tableau $aVilles, qui à chaque clé fait correspondre une valeur (ce qui, en matière de tri, est plutôt relax).
En résumé : ton appli n'est pas vraiment opérationnelle, non pas à cause de ton code, mais à cause des données, dont sont absentes beaucoup de petites localités !
Cependant, en admettant que tu disposes du "vrai" fichier avec toutes les villes (un fichier forcément plus gros), tu serais amené à reformuler ton tableau, ainsi que revoir le code pour le traiter, entrainant un temps d'exécution forcément plus important.

Tu l'auras peut-être compris, mon soucis majeur dans ce type d'application c'est l'optimisation du code, laquelle représente un véritable challenge.
C'est pourquoi je ne me suis guère préoccupé des aspects "phonex" et "soundex" que tu as développé (et qui pourtant m'intéressent), à cause de leurs temps d'exécution vraiment trop monstrueux.
Aussi ne le prends pas mal si je te dis que j'ai réécris ton code : pas de POO, tout dans le même fichier, séparation du style (en fait un code très basique pour débutant que je tiens à ta disposition). Je ne sais pas si le gain de temps est du côté serveur ou du côté client, mais le résultat est là : pour afficher toutes les villes en tapant "*", mon temps d'exécution est divisé par 3 !
Pourtant les modifs effectuées ne sont pas vraiment des optimisations !
Par "optimisation" on pourrait par exemple envisager des fichiers de données déjà triés (un fichier trié par ville et un autre trié par code) sur lesquels on pourrait faire des recherches dichotomiques pour éviter le parcours séquentiel de tout le tableau, on pourrait y mettre le nom des villes directement en minuscules (si l'affichage doit se faire ainsi), on pourrait voir ce que celà donne avec les bases de données, etc...

Voilà, j'espère ne pas t'avoir trop saoulé avec ce roman.
Je te mets 8.
Amicalement.

signaler à un administrateur
Commentaire de malalam le 13/04/2006 07:29:47 administrateur CS

Hello :-)

je vais tâcher de répondre point par point :
- fichier de données incomplet. Oui, je le sais! Mais je m'en fiche, lol, pour une raison simple : les dernières versions de ce code utilise un fichier de type csv (si ce n'est pas le cas, c'est que j'ai oublié d'uploader la dernière version, je vérifierai), donc facile à reproduire. Et on peut donc imaginer que n'importe qui pourra fournir ces propres données.
Par contre, je ne savais pas que plusieurs villages pouvaient partager le même code postal. C'est nettement plus ennuyeux, il faut effectivement réécrire le tableau, et donc le parsing du tableau. "Et toi tu exploites cette propriété pour établir ton tableau $aVilles, qui à chaque clé fait correspondre une valeur (ce qui, en matière de tri, est plutôt relax)." => ben oui, pensant que cela fonctionnait ainsi, je n'allais pas compliquer inutilement les choses?

Je n'ai pas voulu avoir un code forcément très rapide (sans quoi, j'aurais pris une bdd). Il y a pas mal de choses à faire pour le rendre plus rapide : virer soundex2 et phonex en effet (il y a normalement une version sans, d'ailleurs, dans le zip) qui sont là pour le fun. Et puis il serait inutile d'utiliser les deux.

En résumé, tu as eu tout à fait raison d'adapter le code, et de le réécrire pour l'adapter à tes besoins. Virer la POO est évidemment une bonne idée quand on recherche la performance :-) Toujours!
Ceci dit, les deux gros points noirs sont : absence de bdd (et donc stockage en mémoire!), et algos phonex et soundex. Virer les algos fait déjà énormément. Une bdd rendrait le truc quasi instantannée.

ceci dit, tu m'as donné des idées...on peut voir à réécrire le tout pour laisser des choix :-) Enfin on verra, j'ai vraiment plus le temps en ce moment.

signaler à un administrateur
Commentaire de opossum_farceur le 13/04/2006 12:47:40

Rectification du tir : ton fichier de données n'est pas incomplet comme je le prétendais hier, c'est ton code qui n'est pas correct.

Le code incriminé (dans ta classe "ocity") :

$this->aVilles[trim(substr($line,-6))]=strtolower(trim(substr($line,0,strlen($line)-6)));

Mais prenons un exemple :

Si une première ville "ville1" avec le code 123450 se présente, elle est stockée, ce qui donne :
$this->aVilles[123450]="ville1";
Ok, jusque là tout va bien.

Si une deuxième ville "ville2" avec le même code 123450 se présente, elle est stockée, ce qui donne :
$this->aVilles[123450]="ville2";
Et là, rien ne va plus, puisque cette opération écrase "ville1" qui disparaît de ce fait du tableau !

Donc, y'a encore du boulot ! (et pour cette erreur grossière, j'irai bien diminuer la note que je t'ai donné, mais bon...)

Amicalement.

signaler à un administrateur
Commentaire de malalam le 13/04/2006 13:02:31 administrateur CS

Comme je te le disais, ce n'est pas une erreur de programmation, c'est une simple méconnaissance de la façon dont fonctionnent les codes postaux : je ne savais pas que 2 villes pouvaient avoir le même code postal. Je pensais que les codes postaux étaient bien des clefs uniques.

signaler à un administrateur
Commentaire de opossum_farceur le 13/04/2006 20:23:59

Ok pour la méconnaissance, elle a bon dos !, mais moi aussi, avant d'expérimenter ton code, je ne savais pas que plusieurs localités pouvaient avoir le même code !
J'ai de la chance (si on peut dire !), j'ai habité un village qui n'était pas dans ta liste, et c'est seulement ce matin que j'ai lancé une recherche directement dans "data.dat" et que j'ai découvert le "pot aux roses".
En fait, que plusieurs localités puissent avoir le même code postal semble être la règle plutôt que l'exception : je sais maintenant afficher toutes les localités, j'en dénombre 39282 alors qu'avant j'en avais seulement 6426 ! (quant au temps d'affichage, je préfère pas en parler)
C'est dire que le "manque" était important, et, à moins d'être aveugle, qu'il était difficile de ne pas s'en apercevoir !
Ceci dit le boulot du développeur, c'est certe développer, mais c'est aussi se documenter sur les thèmes qu'il aborde (et auxquels il peut, dans un premier temps, ne rien comprendre), tester et retester son code, et surtout, le faire tester par d'autres !
Amicalement.

signaler à un administrateur
Commentaire de malalam le 13/04/2006 23:46:23 administrateur CS

Re,

dis donc, je te trouve limite agressif, quand même, et je me demande bien pourquoi? M'enfin, c'est pas très grave :-) Ceci dit, je vais quand même y répondre...
Je me contre fiche que tu penses que ce soit de la flemme ou un manque de rigueur : j'ai trouvé ce fichier, je me suis dis que ça pourrait être marrant de l'exploiter de cette manière, parce que j'avais déjà dans l'idée de l'appliquer à mon amusement : coder les algo phonex et soundex2 en php.
Bref, j'ai fait ce code pour m'amuser.
Maintenant, un mec l'utilise! Bien :-) Tant mieux si ça peut-être utile.
Il commence par être content, propose des changements parce que ça ne marche pas en php4, alors évidemment j'essaye de l'aider.
Il découvre un bug...bon, ça arrive, et c'est bien : je ne l'aurais pas trouvé tout seul vu que je l'ai intégré très différemment dans un projet. Maintenant, les bugs, je n'aime pas ça, et je compte bien, le règler, dès que j'aurai 5mn.
Ceci dit, inutile de le prendre sur ce ton : ça te plait pas, tu n'utilises pas. Ou tu modifies. Et je prends en compte les critiques, et propositions d'amélioration.
Mais les critiques et les propositions, ça se fait d'une autre manière, dans une société civilisée. Du moins, c'est comme ça que j'ai toujours vu les choses.
J'en viens à la fin de ton commentaire :
"Ceci dit le boulot du développeur, c'est certe développer, mais c'est aussi se documenter sur les thèmes qu'il aborde (et auxquels il peut, dans un premier temps, ne rien comprendre), tester et retester son code, et surtout, le faire tester par d'autres !"
Merci, je connais le boulot de développeur. Et je teste, et reteste ce que je fais au boulot, qui est autrement plus important que ce que je fais ici, et pour lequel je prends évidemment plus de temps. Il est clair que si j'avais à intégrer ce code tel quel dans un projet, il serait très différent, et j'y aurais passé beaucoup plus de temps. Je suis ingénieur développeur web depuis un petit moment, et j'ai bossé dans un tas de domaines très différents, tels que les SIG, la logistique, les réseaux de transport...des domaines auxquels en effet je ne connaissais rien, et sur lesquels j'ai du me documenter, et tout faire pour en comprendre les mécanismes. Tu as donc tout à fait raison là-dessus.
Mais ça, c'est du BOULOT, c'est ma profession, et j'y consacre bien plus de temps qu'à ce que je code pour mes loisirs, pour m'amuser. Ne t'en déplaise, d'ailleurs.
Bref : j'ai pris note du bug, et de l'erreur de conception que j'ai commise par ignorance, merci, et je vais le corriger. Le jour où je coderai n'importe quoi, du premier coup, sans bug, sans erreur...sera un bien triste jour...je n'aurais plus aucun intérêt à coder.

Amicalement aussi (mais sur le même ton, c'est de bonne guerre ;-) )

signaler à un administrateur
Commentaire de opossum_farceur le 14/04/2006 01:21:42

C'était pas dans mon intention de paraître agressif. Malgré tout, si c'est ainsi que tu l'as ressenti, je te prie de m'en excuser.
Bref, j'ai intégré ton fichier dans une base de données MySQL, eh bien tu vas pas me croire, mais l'affichage de toutes les données prend dans ce cas plus de temps (dans les 24 secondes) qu'avec ta méthode du fichier texte (dans les 17 secondes).
Tout ceci me laisse plutôt perplexe.
Amicalement.

signaler à un administrateur
Commentaire de malalam le 14/04/2006 07:56:49 administrateur CS

On oublie :-)

Heu non, je ne te crois pas. lol.
C'est très curieux en effet...très!
Tu as intégré ça de quelle manière ? (quels sont les champs de la table?).
Enfin bon, si j'ai le temps aujourd'hui, je me penche à nouveau sur tout ça, et aussi sur une version mysql (ça, j'ai déja la structure, reste à adapter ces recherches).

signaler à un administrateur
Commentaire de opossum_farceur le 14/04/2006 18:31:18

La structure de "ma" table :

CREATE TABLE `codepostal` (
  `idcodepostal` int(2) unsigned NOT NULL auto_increment,
  `ville` varchar(30) NOT NULL default '',
  `code` int(3) NOT NULL default '0',
  KEY `idcodepostal` (`idcodepostal`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=39283 ;

Comme tu vois, rien que du très ordinaire, j'ai ajouté un champs autoincrément pour que cette table puisse
être gérée correctement depuis une interface administrateur que j'ai, le champ "ville" est exprimé sur 30 octets car la ville la plus "longue" a 27 caractères, quant au champ "code", j'ai opté pour un type numérique codé sur 3 octets, moins gourmand en octets qu'un type "varchar" qui lui aurait nécessité 6
octets.
La place occupée par la table en mémoire est de 1317 Ko, répartis sur 3 fichiers.

Je laisse (momentanément ?) la piste "BD" de côté pour me recentrer sur la piste "fichier texte", avec un
fichier préalablement ordonné et "nettoyé" (si tu supprimes les espaces ton fichier diminue de moitié), sur lequel on puisse procéder directement à une
"fouille dichotomique".
Amicalement.

signaler à un administrateur
Commentaire de FhX le 15/04/2006 20:15:13

"le champ "ville" est exprimé sur 30 octets car la ville la plus "longue" a 27 caractères"
Rectification : 31 octets :) Un champs de type VARCHAR(x) prend comme place x + 1 octet =) Mais ca c'est de la broutille je reconnais :p

Maintenant, quand tu fais une recherche sur un champ en particulier... autant mettre ce champ en INDEX. Ta recherche ira beaucoup plus rapidement du fait de l'indexage.

En théorie bien sur ... !

signaler à un administrateur
Commentaire de juki_webmaster le 18/04/2006 19:38:00

59123;zuydcoote;ZYDK;0.990585013528

Quelqu'un peut m'expliquer le 0.990585013528 ?

signaler à un administrateur
Commentaire de malalam le 19/04/2006 07:47:53 administrateur CS

JUKI -> c'est la clef Phonex.

signaler à un administrateur
Commentaire de malalam le 25/04/2006 15:07:22 administrateur CS

opossum_farceur => c'est mis à jour, pour ce qui concerne les villes ayant le même code postal.

signaler à un administrateur
Commentaire de wizad le 07/05/2006 18:01:12

Une petite question pour malaman : est tu l'auteur de fichier de villes, si oui quel sources à tu utilisé pour obtenir toutes ces infos (me dits pas que tu t'es fait tous les annuaires) et sinon ou à tu trouvé le fichiers. Merci d'avance.
C'est juste que j'ai besoin de travailler sur les villes et codes postaux et j'aurais besoin de savoir comment tu t'es débrouillé pour avoir tout ça trié par ordre alphabétique en plus.

signaler à un administrateur
Commentaire de malalam le 09/05/2006 09:43:45 administrateur CS

Hello,

j'ai utilisé 2 fichiers différents, coup sur coup. Le 1er venait du site de l'université de Nice (me souviens plus l'adresse, mais c'est facile à retrouver), et l'autre, d'une source ici sur phpcs (pareil, me souviens plus de la source lol, mais en cherchant à code postal, ou villes, tu devrais retrouver) qui donnait juste cette liste à disposition.

signaler à un administrateur
Commentaire de wizad le 09/05/2006 09:46:09

merci

signaler à un administrateur
Commentaire de jack_bauer42r le 22/10/2006 09:35:42

est que quelqu'un peu m'expliquer, j'ai essayé de faire tourner le script avec easyphp 1.8 (qui dispose de php 4 notamment) une première erreur apparait à la ligne 4 du fichier index.php et quand je consulte le fichier le mot version et encoding sont soulignés et indiqués comme Syntax Error alors j'ai commenté la ligne alors l'erreur suivante apparait "Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in c:\program files\easyphp1-8\www\zz\villes\php5\ocity.cls.php on line 6".
merci de bien m'éclaircir afin de pouvoir exécuter le script

signaler à un administrateur
Commentaire de malalam le 23/10/2006 11:46:31 administrateur CS

Hello,

c:\program files\easyphp1-8\www\zz\villes\php5\ocity.cls.php on line 6
Tu utilises les classes PHP5, et tu es en PHP4...

Tu dois modifier les require_once du fichier index, pour inclure les classes PHP4 à la place des PHP5.

signaler à un administrateur
Commentaire de matlefoo le 02/03/2007 14:21:55

Bonjour à tous,

J'ai la meme erreur que jack_bauer42rn cad :

Parse error: parse error in c:\documents and settings\mat\mes documents\mon site web\projets\topcoloc\search city\villes_normal\index.php on line 4

Mais j'inclue bien les classes php4
Si je commente la ligne :

<?xml version="1.0" encoding="UTF-8"?>

en début de script, cela marche mais quand je clic sur chercher :

Warning: Invalid argument supplied for foreach() in c:\documents and settings\mat\mes documents\mon site web\projets\topcoloc\search city\villes_normal\php4\ocity.cls.php on line 105

Quelqu'un aurait une idée ? Sachant que je sais pas si je dois configurer quelquechose dans easyphp, j'ai la config par defaut.

signaler à un administrateur
Commentaire de JLN le 02/04/2007 20:18:44

Bonjour,
Ca sert à quoi la possibilité de générer un fichier data2.dat ?
sinon j'ai testé et adopté sur mon serveur perso tellement ca va me rendre la vie facile...

Merci pour la réponse
Bonne prog.
@+ JLN

signaler à un administrateur
Commentaire de soundpanther le 04/05/2008 17:01:27 10/10

Bonjour,

j'ai une erreur sur plusieurs hébergeur 1and1 lycos.fr seconde.fr
fallait-il faire quelque chose avant ?

Parse error: syntax error, unexpected T_STRING in /data/members/free/multimania/fr/m/a/r/marseille13015/htdocs/villes/index.php on line 4

le même message chez tous les hébergeur


Merci d'avance

signaler à un administrateur
Commentaire de malalam le 04/05/2008 17:24:57 administrateur CS

Hello,
c'est ça que n'aiment pas tes hébergeurs parce qu'ils sont en short_tags à On.
<?xml version="1.0" encoding="UTF-8"?>
Vire cette déclaration, elle n'est pas indispensable.

signaler à un administrateur
Commentaire de jcreno le 28/10/2008 09:30:31

salut,

je ne comprends pas pourquoi j'ai cette erreur :
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /var/*****/php4/ocity.cls.php on line 84

J'utilise bien le repertoire php4
ma version php : PHP Version 4.3.10-22

c'est le début de la fonction public function getSearch () {
merci pour vos lumières !
jc

signaler à un administrateur
Commentaire de jcreno le 28/10/2008 10:24:14 9/10

encore moi, je comprends pas trop les classes mais j'ai vu qu'en php4 il faut enlever "private" avant la function, de plus self::$sSearch n'est pas supporté en php4 (L'opérateur de résolution de portée (::)),
(http://www.manuelphp.com/php/language.oop5.paamayim-nekudotayim.php)

comment traduire cela en php4 ?

J'avoue que j'ai un peu de mal là... est-ce que quelqu'un a réussi à faire fonctionner ce script en php 4 ?

merci

JC

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Codes postaux dans un formulaire [ par jasd ] Bonjour,J'ai trouvé le code proposé dans la page http://www.javascriptfr.com/code.aspx?ID=15991 sur l'utilisation des codes postaux dans un formulaire Codes postaux dans un formulaire [ par jasd ] Bonjour,J'ai trouvé le code proposé dans la page http://www.javascriptfr.com/code.aspx?ID=15991 sur l'utilisation des codes postaux dans un formulaire Distance entre 2 codes postaux [ par abdoulax ] J'ai besoin d'aide,J'ai une table qui contient une liste de magazin avec des codes postaux, je voudrai savoir comment faire pour savoir le code postal Recherche avec ajax [ par gazalii ] Bonjour a vous tous je cherche a faire une recherche avec ajax sur des pays (php avec ajax)je veux placer un combo et des que l'utitlisateur ecrit que 3 problèmes [ par damien_iset ] Voici plusieurs choses que j'ai noté en navigant sur codes-sources. Les deux premières sont plutot des erreurs d'orthographes, je fais énormément de f moteur de recherche AJAX [ par djlghoul ] j'ai un site web mais j'aimerai bien l'organiser parceque il est totalement riche en tout les modules et les composants parmi eux moteur de recherche gestion des plaintes [ par lucien1988 ] slt je recherche des codes pour la gestions des plaintes.c'est un projet que je dois finaliser demain et je recherche des codes pour y parvenir.aidez Recherche développeurs [ par cobra84 ] Je recherche des développeurs motivés pour travailler sur le projet Ajax RPG (http://sourceforge.net/projects/ajaxrpg/) Présentation du projet : Ajax Recherche emploi à distance [ par zeus_neon59 ] Bonsoir,Il y a quelques temps déjà j'étais tomber sur une "pub" sur codes-sources parlant d'un site web regroupant des prestataires voulant des morcea codes postaux [ par eax ] salut!je cherche une table mysql avec tous les codes postaux de france et le nom des villes associées lolje sais c un gros travail, mais si qqun l'a d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 4,649 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.