Page 1 sur 2

Tableau à 2 dimensions

Posté : 12 oct. 2006, 20:24
par zeuf
Salut à tous !

Bon, je fais mes recherches sur le forum et je n'ai pas trouvé de réponses au sujet qui me turlupine depuis hier soir (le site doit être prêt dans un mois !) :

Pour faire simple mais rester compréhensible :

Soit une variable de type ARRAY à 2 dimensions :

exemple[0][0];

Disons que cette variable contient "phpfrance", donc :

echo exemple[][]; donne phpfrance

Comment faire pour que cette variable soit de type scalaire et plus ARRAY (afin de l'insérer dans une base MySQL par exemple) ?

J'ai compris l'utilisation d'EXTRACT avec un tableau uni-dimensionel mais pas avec un tableau à 2 dimensions.

Si quelqu'un peut m'éclairer... En attendant, je poursuis mes recherches.

Bien à tous.

Zeuf

Posté : 12 oct. 2006, 20:32
par ouckileou
Boucles imbriquées :
foreach($exemple as $sous_tableau) {
   foreach($sous_tableau as $cle=> $valeur) {
      echo $valeur; // "phpfrance", ici tu en fais ce que tu veux
   }
}
Ou alors tu prends uniquement la première boucle et tu fais le extract à chaque passage.

Posté : 12 oct. 2006, 22:43
par Ajoloca
Bonsoir,

Si tu veux conserver le tableau sur une seule colonne
<?php 
// Transformation du tableau en une chaine
$string = serialize($table_deux_dim);

// La récupération (de la chaine vers tableau)
$tab_deux_dim = unserialize($string);
?>

Posté : 13 oct. 2006, 00:16
par zeuf
Merci à vous deux pour vos réponses rapides. Je vais retenir serialize mais je m'y suis pris autrement (sans doute du mauvais code mais bon... C'est juste pour un transfert).

En fait j'ai fait un fichier CSV des 36798 communes de France et DOM + TOM (90% issu d'un fichier INSEE - cf. site INSEE - épuré et mis à jour à la main, à l'ancienne ! Beaucoup de corrections à la main aussi) dont la structure est :

article de la commune (l',la,les,...) ; commune ; département ; pays CR

Au début je voulais mettre tout cela dans un tableau à 2 dimensions du genre commune[nombre d'enregistrement_soit_36798][nombre de colonnes_soit_4]. Tout fonctionnait bien mais MySQL ne voulait rien savoir sur l'insertion de tableaux à deux dimensions... Donc finalement je m'y suis pris autrement :

En PHP, j'ai lu le fichier CSV caractère par caractère, en codant pour qu'il assemble l'article de la commune avec la commune (la plupart des communes n'ont pas d'articles mais il y en a qui en ont... Genre LE BOULOU et pas BOULOU) et qu'il remplace le retour de chariot par un point virugle et j'ai mis tout cela dans une variable string en concaténant au fur et à mesure.

Au final, je n'avais plus qu'un grand fichier string avec des variables séparées par des points-virgules. Puis j'ai fait un explode pour récupérer un tableau à une dimension et après l'avoir addslashé, trimé et settypé, je l'ai envoyé à MySQL qui l'a bu comme du petit lait... Et là, je fume ma clop tranquille (Dites moi c'est pas encore interdit de fumer virtuellement dans des lieux publics virtuels ? Si ?.... :D )

Je mets le code au cas où mais franchement, c'est pas un modèle du genre.
<?php
// on lit ville.txt et on ensemble toutes les données dans un seul fichier texte
// on assemble l'article avec le nom de la ville les sauts de ligne par des ;
// ce qui donne 3 champs au lieu de 4 séparé par des ;
$ouvrir = fopen("D:/www/_RecupVilles/ville.txt", "r");
$pos=1;
if ($ouvrir) 
	{
  	while (!feof($ouvrir))
	 		{
      	$car=fgets($ouvrir,2);
				$codecar=ord($car);
				if ($codecar<>"13")
					{
							if ($car<>";")
								{
									$tas.=$car;
								}
							else
								{
									if ($pos<>1)
										{
											$tas.=$car;
										}
									else
										{
											$tas=$tas."";
											$pos++;
										}
								}	
					}
				else
					{	
						$tas.=";";
						$car=fgets($ouvrir,2);
						$pos=1;
					}
			}
  }
fclose($ouvrir);

$element=explode(";",$tas);
# On fait un count pour connaitre le nombre de valeur dans l'Array : $nombre_element=count($element);

// On ecrit dans la table MySQL par groupe de 3
	// on ouvre la BD
$connexion=mysqli_connect('localhost','test','2006','baseD');
if (!$connexion) 
	{
  	echo "Connexion impossible à localhost. Erreur : ". mysqli_connect_error();
    exit();
	}

	echo 'connexion ok<br>';

$a=0;
for ($i=0;$i<=36797;$i++)
	{
		$b=$a;
		$b1=$b+1;$b2=$b+2;
		$ville=trim(addslashes(strtolower($element[$b])));
		settype($ville,"string");
		$cle_dept=trim(addslashes(strtolower($element[$b1])));
		$cle_pays=trim(addslashes(strtolower($element[$b2])));
#echo $ville."-".$cle_dept."-".$cle_pays."<br>";
		$enreg_ville=mysqli_query($connexion,"INSERT INTO ville (ville,cle_dept,cle_pays) VALUES ('$ville','$cle_dept','$cle_pays')");
		$a=$a+3;
	}

echo 'its ok';

?> 
Pour moi, c'est résolu.

Allez merci et à bientôt pour une p'tite bouffe et a couple of beers.

Cia

Zeuf

Posté : 13 oct. 2006, 00:20
par ouckileou
Pour moi, c'est résolu.
Le dire c'est bien, le marquer c'est mieux.

Posté : 13 oct. 2006, 00:41
par zeuf
Oui j'ai été cherché un verre de coca mais j'allais le faire (j'ai lu au moins 3 fois les règles du forum pour ne pas me faire lourder :D )

Encore tout cas encore merci

Zeuf

Posté : 13 oct. 2006, 00:48
par Ajoloca
Re,

Il date de quand ton fichier INSEE ???

J'ai moi aussi une base contenant les communes de France et DOM + TOM, mais j'ai 38.949 enregistrements

est tu sur qu'il est complet ?

Posté : 13 oct. 2006, 01:11
par zeuf
Salut,

Page de téléchargement du site de l'INSEE http://www.insee.fr/fr/nom_def_met/nome ... gement.asp au 13 octobre 2006 :
Code officiel géographique 2006

...

* Liste des communes de la métropole et DOM
(toutes les communes ayant existé depuis 1943)
Format dbf zippé : 935 Ko - Format txt zippé : 737 Ko

* Liste des communes existantes au 1er janvier 2006
Format dbf zippé : 731 Ko - Format txt zippé : 586 Ko
* Historique des communes
Format dbf zippé : 178 Ko - Format txt : 747 Ko
* Mise à jour des communes
Format dbf : 43 Ko - Format txt : 13 Ko
* Liste des cantons
Format dbf : 655 Ko - Format txt : 207 Ko
* Liste des arrondissements
Format dbf : 55 Ko - Format txt : 14 Ko
* Liste des départements
Format dbf : 16 Ko - Format txt : 4 Ko
* Liste des régions
Format dbf : 4 Ko - Format txt : 1 Ko
* Liste des pays et territoires étrangers
Format dbf : 49 Ko - Format txt : 15 Ko
Télécharger les fichiers des années précédentes
Donc mes infos date de 2006 (1er janvier). Mais il y a moins de communes quand tu ne prends que la France et les DOM, j'ai rajouté une à une les villes des TOM.

Moi, je ne suis jamais sûr de rien mais j'ai vérifié toutes mes communes (car il y a 2 erreurs dans le fichier INSEE original) et puis tout dépend si tu as mis les arrondissements (pour Paris, Marseille, Lyon), certains Cantons, etc...

De toute façon, les infos que j'ai proviennent de l'INSEE directement, donc tout me va.

Mais on a presque 2000 communes de différence, c'est énorme. As-tu vérifié ta base ? (Moi, oui, c'est sûr).

A +

Posté : 13 oct. 2006, 01:45
par Ajoloca
Re,

Oui, j'ai vérifié la base, c'est la première chose que j'ai fait quand j'ai vue la difference.
J'ai effectivement les arrondissements, les liux-dits, Monaco et Corse

Posté : 13 oct. 2006, 02:08
par zeuf
Oui, moi je n'ai pas les lieux-dits (où trouves-tu la liste officiel des lieux-dits ? Parce qu'avec Google, je galère), j'ai la Corse, pour Monaco, je n'ai que... Monaco... 2000 lieux-dits de plus c'est beaucoup... Et tu as mis les Tom, parce que j'ai les Tom moi en plus (Afrique et Terres Australes, ...) ? Mais bon, si cela fait 100 communes, c'est un maximum...

Posté : 13 oct. 2006, 02:26
par Ajoloca
Re,
Voilà ce que j'ai

Code : Tout sélectionner

+--------+-------------------------+ | villes | dep | +--------+-------------------------+ | 458 | AIN | | 830 | AISNE | | 320 | ALLIER | | 238 | ALPES DE HAUTE PROVENCE | | 192 | ALPES MARITIMES | | 348 | ARDECHE | | 504 | ARDENNES | | 344 | ARIEGE | | 460 | AUBE | | 451 | AUDE | | 323 | AVEYRON | | 608 | BAS RHIN | | 195 | BOUCHES DU RHONE | | 756 | CALVADOS | | 270 | CANTAL | | 423 | CHARENTE | | 511 | CHARENTE MARITIME | | 295 | CHER | | 290 | CORREZE | | 414 | CORSE | | 719 | COTE D'OR | | 426 | COTES D'ARMOR | | 270 | CREUSE | | 353 | DEUX SEVRES | | 571 | DORDOGNE | | 632 | DOUBS | | 393 | DROME | | 208 | ESSONNE | | 703 | EURE | | 425 | EURE ET LOIR | | 300 | FINISTERE | | 368 | GARD | | 468 | GERS | | 562 | GIRONDE | | 39 | GUADELOUPE | | 24 | GUYANE | | 400 | HAUT RHIN | | 594 | HAUTE GARONNE | | 267 | HAUTE LOIRE | | 557 | HAUTE MARNE | | 580 | HAUTE SAONE | | 327 | HAUTE SAVOIE | | 208 | HAUTE VIENNE | | 189 | HAUTES ALPES | | 488 | HAUTES PYRENEES | | 41 | HAUTS DE SEINE | | 348 | HERAULT | | 368 | ILLE ET VILAINE | | 250 | INDRE | | 278 | INDRE ET LOIRE | | 568 | ISERE | | 588 | JURA | | 337 | LANDES | | 295 | LOIR ET CHER | | 338 | LOIRE | | 257 | LOIRE ATLANTIQUE | | 351 | LOIRET | | 340 | LOT | | 325 | LOT ET GARONNE | | 200 | LOZERE | | 385 | MAINE ET LOIRE | | 640 | MANCHE | | 631 | MARNE | | 37 | MARTINIQUE | | 275 | MAYENNE | | 22 | MAYOTTE | | 626 | MEURTHE ET MOSELLE | | 579 | MEUSE | | 1 | MONACO | | 266 | MORBIHAN | | 767 | MOSELLE | | 324 | NIEVRE | | 673 | NORD | | 26 | NOUVELLE-CALEDONIE | | 697 | OISE | | 508 | ORNE | | 20 | PARIS | | 920 | PAS DE CALAIS | | 62 | POLYNESIE FRANCAISE | | 491 | PUY DE DOME | | 565 | PYRENEES ATLANTIQUES | | 239 | PYRENEES ORIENTALES | | 86 | REUNION | | 344 | RHONE | | 595 | SAONE ET LOIRE | | 382 | SARTHE | | 331 | SAVOIE | | 544 | SEINE ET MARNE | | 762 | SEINE MARITIME | | 41 | SEINE SAINT DENIS | | 818 | SOMME | | 3 | ST PIERRE ET MIQUELON | | 326 | TARN | | 195 | TARN ET GARONNE | | 103 | TERRITOIRE DE BELFORT | | 191 | VAL D'OISE | | 52 | VAL DE MARNE | | 186 | VAR | | 153 | VAUCLUSE | | 299 | VENDEE | | 298 | VIENNE | | 532 | VOSGES | | 3 | WALLIS ET FUTUNA | | 482 | YONNE | | 283 | YVELINES | +--------+-------------------------+ 105 rows in set (0.06 sec)

Posté : 13 oct. 2006, 03:44
par zeuf
Oui j'ai la même chose que toi en Département, j'en ai un en plus : Afrique (Océan Indien) et Terres Australes (mais bon... Je pense qu'il n'y aura pas beaucoup de personnes provenant de ces régions qui se connecteront !! :D )
amsterdam (taaf)
archipel crozet (taaf)
archipel kerguelen (taaf)
bassas da india (ocean indien)
europa (ocean indien)
glorieuses (ocean indien)
iles tromelin (ocean indien)
juan de nova (ocean indien)
saint-paul (taaf)
terre-adelie (taaf)
Terres Australes et Antarctiques Françaises (T.A.A.F.)

Posté : 13 oct. 2006, 12:41
par Ajoloca
Bonjour,
Tu as ma même chose en départements, mais pas le même nombre de villes par département. La colonne 'villes' représente le nombre de villes dans le département.

Posté : 13 oct. 2006, 14:53
par zeuf
Ah oui merde, j'avais pas compris. Voilà ce que j'ai :

Code : Tout sélectionner

1 Ain 419 2 Aisne 816 3 Allier 320 4 Alpes-de-Haute-Provence 200 5 Hautes-Alpes 177 6 Alpes-Maritimes 163 7 Ardeche 339 8 Ardennes 462 9 Ariege 332 10 Aube 433 11 Aude 438 12 Aveyron 304 13 Bouches-du-Rhone 119 14 Calvados 706 15 Cantal 260 16 Charentes 404 17 Charente-Maritime 472 18 Cher 290 19 Correze 286 20 Corse 360 21 Cote-d'Or 707 22 Cotes-d'Armor 373 23 Creuse 260 24 Dordogne 556 25 Doubs 594 26 Drome 369 27 Eure 675 28 Eure-et-Loire 403 29 Finistere 283 30 Gard 353 31 Haute-Garonne 588 32 Gers 463 33 Gironde 542 34 Herault 343 35 Ille-et-Vilaine 352 36 Indre 247 37 Indre-et-Loire 277 38 Isere 533 39 Jura 545 40 Landes 331 41 Loir-et-Cher 291 42 Loire 327 43 Haute-Loire 260 44 Loire-Atlantique 221 45 Loiret 334 46 Lot 340 47 Lot-et-Garonne 319 48 Lozere 185 49 Maine-et-Loire 363 50 Manche 602 51 Marne 619 52 Haute-Marne 433 53 Mayenne 261 54 Meurthe-et-Moselle 594 55 Meuse 500 56 Morbihan 261 57 Moselle 730 58 Nievre 312 59 Nord 652 60 Oise 693 61 Orne 505 62 Pas-de-Calais 894 63 Puy-de-Dome 470 64 Pyrenees-Atlantiques 547 65 Hautes-Pyrenees 474 66 Pyrenees-orientales 226 67 Bas-Rhin 526 68 Haut-Rhin 377 69 Rhone 293 70 Haute-Saone 545 71 Saone-et-Loire 573 72 Sarthe 375 73 Savoie 305 74 Haute-Savoie 294 75 Paris 1 76 Seine-Maritime 745 77 Seine-et-Marne 514 78 Yvelines 262 79 Deux-Sevres 307 80 Somme 783 81 Tarn 324 82 Tarn-et-Garonne 195 83 Var 153 84 Vaucluse 151 85 Vendee 282 86 Vienne 281 87 Haute-Vienne 201 88 Vosges 515 89 Yonne 454 90 Territoire-de-Belfort 102 91 Essonne 196 92 Hauts-de-Seine 36 93 Seine-Saint-Denis 40 94 Val-de-Marne 47 95 Val-d'Oise 185 971 Guadeloupe 34 972 Martinique 34 973 Guyane 22 974 Reunion 24 975 Saint-Pierre-et-Miquelon 2 985 Mayotte 17 986 Wallis-et-Futuna 3 987 Polynesie-Francaise 49 988 Nouvelle-Caledonie 33 984 Afrique et Terres Australes 10 Monaco 1
Zut... Comment tu fais pour avoir un tableau clean comme ça ! Moi je galère !!

Posté : 13 oct. 2006, 15:00
par Ajoloca
C'est une simple requête SQL et j'ai copié-collé le résultat entre les balises [ code] et [ /code] (sans les espaces après [, j'ai mis les espaces pour pas qu'elles soient interprétées).