Parser un xml ( durée du traitement )

WRInaute occasionnel
Bonjour,

J'essaye de parser actuellement un catalogue de produits dont le xml ressemble à cela puis j'insére le contenu en Base de donnée mysql.

Code:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<products>
<product>
  <id>896292</id>
  <name>nom</name>
  <manufacturer>marque</manufacturer>
  <manufacturer-id>22</manufacturer-id>
  <description>description</description>

  <category>category</category>
  <category-id>2</category-id>
  <number-of-retailers>16</number-of-retailers>
  <image-url height="108" width="150">image-url</image-url>
  <rating type="professional">

    <average>4,1</average>
    <num-ratings>8</num-ratings>
  </rating>
  <lowest-price currency="EUR"prix bas</lowest-price>
  <highest-price currency="EUR">prix-haut</highest-price>
  <properties>
    <group>

      <name>Caractéristiques du produit</name>
      <property>
        <id>3916</id>
        <name>caract1</name>
        <value>valeur</value>
      </property>
    </group>

    <group>
      <name>nom</name>
      <property>
        <id>13</id>
        <name>Type </name>
        <value>valeur</value>
      </property>

    </group>
  
  </properties>
  <retailer>
    <id>27907</id>

    <name>nom1</name>
    <link>lien</link>
    <logo height="50" width="150">image logo</logo>
    <stock-info>Disponible en stock</stock-info>

    <price currency="EUR">prix</price>
    <source-type>www</source-type>
    <source-date>2008-07-04</source-date>
    <price-with-shipping-min currency="EUR">prix1</price-with-shipping-min>
    <price-with-shipping-max currency="EUR">prix2</price-with-shipping-max>
  </retailer>

<retailer>
    <id>27800</id>

    <name>nom2</name>
    <link>lien2</link>
    <logo height="50" width="150">image2 logo</logo>
    <stock-info>Disponible en stock</stock-info>

    <price currency="EUR">prix2</price>
    <source-type>www</source-type>
    <source-date>2008-07-04</source-date>
    <price-with-shipping-min currency="EUR">prix1bis</price-with-shipping-min>
    <price-with-shipping-max currency="EUR">prix2bis</price-with-shipping-max>
  </retailer> 

</product>
</products>

Après plusieurs essais je suis arrivé à une solution qui fonctionne mais qui me parait très lourde en effet lorsque je parse un fichier contenant au alentour de 800 produits ( fichier 4 Mo environ ), j'arrive à une exécution du script de pres de 45s. ( sachant que j'ai plusieurs fichiers de cette taille à traiter: on se rend bien compte que je vais avoir un problème de charge...)
Dans le script ci-dessous. Mon principe et d'enregistrer dans un tableau toutes les données d'un produit. Une fois la balise de fermeture du produit atteinte j'enregistre le contenu du tableau en bdd.
Ensuite je réinitialise le tableau et je recommence pour le produit suivant et ainsi de suite...
Mon but actuellement et d'optimiser ce code et d'accélérer l'exécution.
Mais la j'ai trop réfléchi, je suis à court d'idées. :? Ou alors il va falloir que je trouve une autre méthode.




Code:
<?php
	  @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");

$profondeur = array(); // profondeur des items
$tableau = array(); // tableau pour l'enregistrement des contenus

 $fichier = "test.xml"; // fichier xml

// *********************************************************** DEBUT BALISE OUVRANTE *******************************************************************************************
    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
      
      global $profondeur;
      global $fin_produit;
	  global $tableau;
     
      $profondeur[$parseur]++;
  
        // Si on rencontre la balise PRODUCT  ( nouveau produit) , on réinitialise le tableau
	     if ($derniereBaliseRencontree=="PRODUCT")
					{
					$tableau = array(); // vide le tableau
					$id_categorie="";
					$categorie="";
					$id_produit="";
					$produit="";
					$marque="";
					$description="";
					$image="";
					$nombre_marchands="";
					$tarif_moins="";
					$tarif_plus=""; 

					}
	  
	  
	   // detection fin presentation produit  
	if ($derniereBaliseRencontree=="PROPERTIES") {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]="fin_produit";}
	  
      
      }// Fin fonction balise ouvrante
   
// *********************************************************** FIN BALISE OUVRANTE *******************************************************************************************   
   
   
   
   
   
   
   
// *********************************************************** DEBUT BALISE FERMANTE *******************************************************************************************
    function fonctionBaliseFermante($parseur, $nomBalise)
      {
        // On oublie la dernière balise rencontrée
        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";

		global $profondeur;
		global $tableau;
		global $balisefermante;
	  
	  $balisefermante=$nomBalise;
	  
	  // recherche marchand 
	
	if ($balisefermante=="RETAILER") {$tableau[][$profondeur[$parseur]][$balisefermante]="fin_marchand";}// fin marchand
	if ($balisefermante=="PROPERTY") {$tableau[][$profondeur[$parseur]][$balisefermante]="fin_propriete";} // Fin propriétés
	  
	 if ($balisefermante=="PRODUCT") // détection fin de produit et enregistrement en BDD
					{
								
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)
			{ 					
					
			if (($tableau[$i]['3']['CATEGORY-ID'])!="") {$id_categorie = $tableau[$i]['3']['CATEGORY-ID']; }
			if (($tableau[$i]['3']['CATEGORY'])!="") {$categorie = $tableau[$i]['3']['CATEGORY']; }
			if (($tableau[$i]['3']['ID'])!="") {$id_produit = $tableau[$i]['3']['ID']; }
			if (($tableau[$i]['3']['NAME'])!="") {$produit =$tableau[$i]['3']['NAME']; }
			if (($tableau[$i]['3']['MANUFACTURER'])!="") {$marque = $tableau[$i]['3']['MANUFACTURER']; }
			if (($tableau[$i]['3']['DESCRIPTION'])!="") {$description = $tableau[$i]['3']['DESCRIPTION']; }
			if (($tableau[$i]['3']['IMAGE-URL'])!="") {$image = $tableau[$i]['3']['IMAGE-URL']; }
			if (($tableau[$i]['3']['NUMBER-OF-RETAILERS'])!="") {$nombre_marchands = $tableau[$i]['3']['NUMBER-OF-RETAILERS']; }
			if (($tableau[$i]['3']['LOWEST-PRICE'])!="") {$tarif_moins = $tableau[$i]['3']['LOWEST-PRICE']; }
			if (($tableau[$i]['3']['HIGHEST-PRICE'])!="") {$tarif_plus = $tableau[$i]['3']['HIGHEST-PRICE'];}	
			
			
			
			
			if (($tableau[$i]['6']['NAME'])!="") {$caracteristique=$tableau[$i]['6']['NAME'];}
			if (($tableau[$i]['6']['VALUE'])!="") {$valeur_caracteristique=$tableau[$i]['6']['VALUE'];}

 
 
			if (($tableau[$i]['4']['NAME'])!="") { $marchand = $tableau[$i]['4']['NAME'];  }
			if (($tableau[$i]['4']['LINK'])!="") { $lien = $tableau[$i]['4']['LINK'];  }
			if (($tableau[$i]['4']['LOGO'])!="") { $logo = $tableau[$i]['4']['LOGO'];  }
			if (($tableau[$i]['4']['STOCK-INFO'])!="") { $stock = $tableau[$i]['4']['STOCK-INFO'];  }
			if (($tableau[$i]['4']['PRICE'])!="") { $prix= $tableau[$i]['4']['PRICE'];  }
			if (($tableau[$i]['4']['PRICE-WITH-SHIPPING-MIN'])!="") { $prix_avec_frais = $tableau[$i]['4']['PRICE-WITH-SHIPPING-MIN']; }
 
 
//*********************************************************************************************** enregistrement des produits	
			if (($tableau[$i]['3']['PROPERTIES'])=="fin_produit") 
					{
					$table="table1";
				$query = 'INSERT INTO `'.$table.'` (`id_categorie`,`categorie`,`id_produit`,`produit`,`marque`,`description`,`image`,`nombre_marchands`,`tarif_moins`,`tarif_plus`) VALUES (\''.$id_categorie.'\', \''.$categorie.'\', \''.$id_produit.'\', \''.$produit.'\', \''.$marque.'\', \''.$description.'\', \''.$image.'\', \''.$nombre_marchands.'\', \''.$tarif_moins.'\', \''.$tarif_plus.'\');'; 
				$result = mysql_query($query);
					}

			
//**********************************************************************************enregistrement des caractéristiques des produits	
				if (($tableau[$i]['5']['PROPERTY'])=="fin_propriete")
								{
								$table="table2";
								$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$caracteristique.'\', \''.$valeur_caracteristique.'\');'; 
								$result = mysql_query($query);
								$caracteristique="";$valeur_caracteristique="";
								}
			
			
//*****************************************************************************enregistrement des caractéristiques des marchands			
				if (($tableau[$i]['3']['RETAILER'])=="fin_marchand")
							{ 	
							$table="table3";
							$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$marchand.'\', \''.$lien.'\', \''.$logo.'\', \''.$stock.'\', \''.$prix.'\', \''.$prix_avec_frais.'\');'; 
							$result = mysql_query($query);
							$marchand="";$lien="";$logo="";$stock="";$prix="";$prix_avec_frais="";
							}
					
			} // FIN boucle for
		
					
			
					}//FIN produit

      $profondeur[$parseur]--;

      
      }//FIN balise fermante
// *********************************************************** FIN BALISE FERMANTE *******************************************************************************************
	  
	  
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;
		global $tableau;

if (($derniereBaliseRencontree=="ID")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }		
if (($derniereBaliseRencontree=="NAME")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="MANUFACTURER")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="DESCRIPTION")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="CATEGORY")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="CATEGORY-ID")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }		
if (($derniereBaliseRencontree=="NUMBER-OF-RETAILERS")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="IMAGE-URL")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="LOWEST-PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="HIGHEST-PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }

if (($derniereBaliseRencontree=="VALUE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="LINK")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="LOGO")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="STOCK-INFO")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="PRICE-WITH-SHIPPING-MIN")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }

 
         
    }

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {

        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

//*********************************************
 
 
 mysql_close();	

?>

Merci pour votre aide , j'en ai bien besoin :D
 
WRInaute accro
euh, pourquoi ne pas utiliser les fonctions toutes faite ? faire un DOMelement ? ou utiliser simpleXML ?
 
WRInaute occasionnel
A ça je ne sais pas . Je l'ai vu passer plusieurs fois mais pour l'instant je ne m'y suis pas intéressé. Surement à tord peut-être ..

Apparemment Domxml existe en php4
 
WRInaute impliqué
bon, c'est vrai que le code est compliqué à relire, après plusieurs minutes d'effort, je comprend pas la logique du $tableau[]
mais bon je me dis que cela ne peux venir que de cette boucle (pour peux que cela soit mal nettoyé)
Code:
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)
peut etre rajouter une trace pour etre sur que sizeof($tableau) n'est pas exponentiel...
tu lances ce script sur quel config système ?
 
WRInaute occasionnel
julienr a dit:
bon, c'est vrai que le code est compliqué à relire, après plusieurs minutes d'effort, je comprend pas la logique du $tableau[]
mais bon je me dis que cela ne peux venir que de cette boucle (pour peux que cela soit mal nettoyé)
Code:
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)
peut etre rajouter une trace pour etre sur que sizeof($tableau) n'est pas exponentiel...
tu lances ce script sur quel config système ?

Merci d'essayer de prendre le temps de me relire :?
En fait j'ai mis le tableau , à cause de l'insertion en base de donnée pour que tous les éléments d'un produit soient sur une même ligne. Mais peut -être que l'on peut faire autrement
Pour le sizeof($tableau). Je viens d'afficher les tailles des tableaux pour 100 produits par exemple. Et c'est vrai que toutes ces boucles cela doit être long. Voila ce que j'ai obtenu.
Code:
243
274
272
306
106
179
155
300
153
275
164
218
324
236
284
226
220
183
333
268
245
233
292
219
265
161
239
271
121
168
115
283
175
171
278
273
171
163
276
341
291
156
325
282
170
340
227
228
249
199
253
291
227
151
144
183
213
144
261
205
210
286
221
143
166
202
253
239
192
142
147
145
209
176
139
156
150
242
229
187
226
139
199
122
178
172
160
162
152
258
115
158
103
311
211
169
140
150
286
128
 
WRInaute impliqué
oui bah la c claire faut trouver une façon de se passer de cette structuration en $tableau[]

en moyenne tu fais 200 itérations par produits soit 200 * 800 produits * ~15 tests/affectations ...
 
WRInaute occasionnel
En fait je n'aurais pas trop de problème s'il y avait des balises de nom différents pour une caractéristique donnée.
Mais ici en plus du nom de la balise, il faut que je teste également la profondeur.
Pour bien faire , il faudrait que je rentre les données dans la base au fur et à mesure que je parcours le flux.
On va essayer .....
 
WRInaute impliqué
Ici la profondeur ne veux trop rien dire, à ta place je maintiendrais à jour le chemin courant en empilant dépilant les balises, et pour stocker les ID's identiques tu préfixes par le chemin
 
WRInaute occasionnel
Bon ça y est j'ai recodé sans utiliser de tableau et de boucle. Ca marche mais c'est toujours aussi long pfffff. Il met exactement 1min 30 pour 900 produits.
Par contre ce qui est bizarre , c'est que je n'ai plus le message:
" Maximum execution time of 30 seconds exceeded ". Le script continu au-dela de 30 s sans problème.
J'ai remarqué aussi que malgré
Code:
@ignore_user_abort(false);
le script continu même si je ferme le navigateur ??

Sinon voici le nouveau code:
Code:
<?php

@ignore_user_abort(false);

include 'bdd.php';

	  @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");


$profondeur = array(); // profondeur des items

 $fichier = "fichier.xml";

// *********************************************************** BALISE OUVRANTE *******************************************************************************************
    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
      
      global $profondeur;
	
     
      $profondeur[$parseur]++;

      }// Fin fonction balise ouvrante
   
  
// *********************************************************** BALISE FERMANTE *******************************************************************************************
    function fonctionBaliseFermante($parseur, $nomBalise)
      {
        // On oublie la dernière balise rencontrée
        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";

		global $profondeur;
	
		global $balisefermante;
	  
	  $balisefermante=$nomBalise;
	  
		if ($balisefermante=="PRODUCTS") {exit;}

      $profondeur[$parseur]--;


      
      }//FIN balise fermante

	  
	  
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;
		global $id_produit;
		global $id_categorie;
		global $caracteristique;
		global $marchand;
		global $lien;
		global $logo;
		global $stock;
		global $prix;
		


if (($derniereBaliseRencontree=="ID") && $profondeur[$parseur]==3) {
				$table="table1";
				$id_produit=$texte;
				$query = 'INSERT INTO `'.$table.'` (`id_produit`) VALUES ( \''.$texte.'\')'; 
				$result = mysql_query($query);


 }		
if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==3) {

				$table="table1";
				 
				$query = "UPDATE $table SET produit='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);

 }
if (($derniereBaliseRencontree=="MANUFACTURER") && $profondeur[$parseur]==3) {
				$table="table1";
				$query = "UPDATE $table SET marque='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);





  }
if (($derniereBaliseRencontree=="DESCRIPTION") && $profondeur[$parseur]==3) {

				$table="table1";
				$query = "UPDATE $table SET description='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);


 }
if (($derniereBaliseRencontree=="CATEGORY") && $profondeur[$parseur]==3) {
				$table="table1";
				$query = "UPDATE $table SET categorie='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);



 }
if (($derniereBaliseRencontree=="CATEGORY-ID") && $profondeur[$parseur]==3) {

				$table="table1";
				$id_categorie=$texte;
				$query = "UPDATE $table SET id_categorie='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);


 }		
if (($derniereBaliseRencontree=="NUMBER-OF-RETAILERS") && $profondeur[$parseur]==3) {

				$table="table1";
				$query = "UPDATE $table SET nombre_marchands='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);


 }
if (($derniereBaliseRencontree=="IMAGE-URL") && $profondeur[$parseur]==3) {

				$table="table1";
				$query = "UPDATE $table SET image='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);



 }
if (($derniereBaliseRencontree=="LOWEST-PRICE") && $profondeur[$parseur]==3) {

				$table="table1";
				$query = "UPDATE $table SET tarif_moins='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);


 }
if (($derniereBaliseRencontree=="HIGHEST-PRICE") && $profondeur[$parseur]==3) {

				$table="table1";
				$query = "UPDATE $table SET tarif_plus='$texte' where id_produit = '$id_produit' "; 
				$result = mysql_query($query);




  }
  
 // ********************************************************  ECRITURE CARACTERISTIQUES ************************************************************************** 
  
 if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==6) {
								$table="table2";
								$caracteristique=$texte;
						

} 
  

if (($derniereBaliseRencontree=="VALUE") && $profondeur[$parseur]==6) {
								$table="table2";
								$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$caracteristique.'\', \''.$texte.'\');'; 
								$result = mysql_query($query);



}


//********************************************* ECRITURE MARCHANDS *******************************************************************************

if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==4) {

							$table="table3";
							$marchand=$texte;
					


 }

if (($derniereBaliseRencontree=="LINK") && $profondeur[$parseur]==4) {

							$table="table3";
							$lien=$texte;
				



 }
if (($derniereBaliseRencontree=="LOGO") && $profondeur[$parseur]==4) {

							$table="table3";
							$logo=$texte;
							


 }
if (($derniereBaliseRencontree=="STOCK-INFO") && $profondeur[$parseur]==4) {
							$table="table3";
							$stock=$texte;
							



 }
if (($derniereBaliseRencontree=="PRICE") && $profondeur[$parseur]==4) {
							$table="table3";
							$prix=$texte;
					



  }

if (($derniereBaliseRencontree=="PRICE-WITH-SHIPPING-MIN") && $profondeur[$parseur]==4) {
							$table="table3";
							
							$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$marchand.'\', \''.$lien.'\', \''.$logo.'\', \''.$stock.'\', \''.$prix.'\', \''.$texte.'\');'; 
							$result = mysql_query($query);


 }


 
         
    } // fin fonctioTexte

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {
	
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

 
 
		 
 
 echo "LECTURE ACCOMPLI";
 
 mysql_close();	

?>

La j'ai épuisé mes ressources. Je ne sais plus comment faire. :?
 
WRInaute impliqué
oui là tu es pénalisé parce que tu fais bcp plus de requêtes. Voici la base d'un bout de code qui sera facilement modifiable pour y insérer tes requêtes :

Code:
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
	global $profondeur;
	global $tableau;
     
	array_push( $profondeur, $nomBalise );
		
	if( count($tableauAttributs) > 0 )
	{
		$path = implode( "_", $profondeur );
		foreach( $tableauAttributs as $k => $v )
		{
			$tableau[$path."_".$k] = $v;
		}
	}
}    
   
function fonctionBaliseFermante($parseur, $nomBalise)
{
	global $profondeur;
	global $tableau;

	if ($nomBalise=="PRODUCT")
	{
		print_r( $tableau );
		$tableau=array();
    }
      
      
	array_pop( $profondeur );
}   
    

function fonctionTexte($parseur, $texte)
{
	global $profondeur;
	global $tableau;

	$path = implode( "_", $profondeur );
      
	$tableau[$path] = $texte;
}

ce qui affiche :

Code:
Array
(
    [PRODUCTS] => 

    [PRODUCTS_PRODUCT] => 


    [PRODUCTS_PRODUCT_ID] => 896292
    [PRODUCTS_PRODUCT_NAME] => nom
    [PRODUCTS_PRODUCT_MANUFACTURER] => marque
    [PRODUCTS_PRODUCT_MANUFACTURER-ID] => 22
    [PRODUCTS_PRODUCT_DESCRIPTION] => description
    [PRODUCTS_PRODUCT_CATEGORY] => category
    [PRODUCTS_PRODUCT_CATEGORY-ID] => 2
    [PRODUCTS_PRODUCT_NUMBER-OF-RETAILERS] => 16
    [PRODUCTS_PRODUCT_IMAGE-URL_HEIGHT] => 108
    [PRODUCTS_PRODUCT_IMAGE-URL_WIDTH] => 150
    [PRODUCTS_PRODUCT_IMAGE-URL] => image-url
    [PRODUCTS_PRODUCT_RATING_TYPE] => professional
    [PRODUCTS_PRODUCT_RATING] => 
  
    [PRODUCTS_PRODUCT_RATING_AVERAGE] => 4,1
    [PRODUCTS_PRODUCT_RATING_NUM-RATINGS] => 8
    [PRODUCTS_PRODUCT_LOWEST-PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_LOWEST-PRICE] => prix bas
    [PRODUCTS_PRODUCT_HIGHEST-PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_HIGHEST-PRICE] => prix-haut
    [PRODUCTS_PRODUCT_PROPERTIES] => 
  
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP] => 

    
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_NAME] => nom
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY] => 
      
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_ID] => 13
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME] => Type 
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE] => valeur
    [PRODUCTS_PRODUCT_RETAILER] => 
  
    [PRODUCTS_PRODUCT_RETAILER_ID] => 27907
    [PRODUCTS_PRODUCT_RETAILER_NAME] => nom1
    [PRODUCTS_PRODUCT_RETAILER_LINK] => lien
    [PRODUCTS_PRODUCT_RETAILER_LOGO_HEIGHT] => 50
    [PRODUCTS_PRODUCT_RETAILER_LOGO_WIDTH] => 150
    [PRODUCTS_PRODUCT_RETAILER_LOGO] => image logo
    [PRODUCTS_PRODUCT_RETAILER_STOCK-INFO] => Disponible en stock
    [PRODUCTS_PRODUCT_RETAILER_PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE] => prix
    [PRODUCTS_PRODUCT_RETAILER_SOURCE-TYPE] => www
    [PRODUCTS_PRODUCT_RETAILER_SOURCE-DATE] => 2008-07-04
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN] => prix1
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MAX_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MAX] => prix2
)

ensuite si toujours pas de perf faudra voir à changer de serveur ...
 
WRInaute occasionnel
Ok merci pour ton aide. je vais voir ce que cela donne comme ça. Sinon après j'abandonne....
En fait ce sont maintenant les requètes sql qui ralentissent l'exécution. C'est çà ?
 
WRInaute impliqué
vi normalement lire un fichier avec php de 4mo doit te prendre 1 ou 2s pas plus
le parser normalement c'est pas non plus d'une complexité énorme surtout avec xml_parse
par contre faire 800 insert dans mysql ca ca à cout surtout que cela dépend bcp de la config du serveur (mémoire / charge, vitesse accès disque)

essaye simplement mes handlers avec le fichiers complets sans insert mysql, pour mesurer le tps de parse

ensuite je suis retourné voir tes insert dans ton premier script, je pense que tu devrais dénormaliser et faire qu'une seule table avec comme colonnes toutes les infos d'un produit/retailer/details du xml, ca te ferait 3 fois moins d'insert...

tiens moi au courant ;-)

edit (17h): je viens de me constituer un fichier de 800 fois l'enregistrement que tu as donné (taille 1mo), parser en moins de 1s en local sur mon ordi. En rajoutant un insert sur une table avec un seul champ id_produit, script fini en 2s max. Ca commence par quel lettre ton hébergeur :) ?
 
WRInaute occasionnel
Me revoilà :D . Bon je viens de faire des tests sur un fichier de 900 produits d'une taille de 7Mo.

J'ai testé ton script brut ( que je trouve excellent d'ailleurs ) , il a mis 15 s à s'accomplir. Par contre je viens de remarquer qu'il faut faire une modification dedans car pour un produit donné il y a plusieurs groupes différents du style :
Code:
<group>
      <name>nom</name>
      <property>
        <id>13</id>
        <name>Type </name>
        <value>valeur</value>
      </property>

    </group>
Comme donné dans l'exemple.
Lorsque le script se lance ,seul le dernier apparait vu que cela est écrasé au fur et à mesure. Il en est de même pour le groupe
Code:
<retailer>
    <id>27907</id>

    <name>nom1</name>
    <link>lien</link>
    <logo height="50" width="150">image logo</logo>
    <stock-info>Disponible en stock</stock-info>

    <price currency="EUR"prix</price>
    <source-type>www</source-type>
    <source-date>2008-07-04</source-date>
    <price-with-shipping-min currency="EUR">prix1</price-with-shipping-min>
    <price-with-shipping-max currency="EUR">prix2</price-with-shipping-max>
  </retailer>

De mon côté j'ai modifié mon dernier script de la façon ci-dessous. J'arrive
maintenant à un temps d'exécution de 30s avec insertion en bdd . On y arrive petit à petit :D

Code:
<?php
include 'bdd.php';

	  @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");

$profondeur = array(); // profondeur des items

 $fichier = "fichier.xml";

// *********************************************************** BALISE OUVRANTE *******************************************************************************************
    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
      
      global $profondeur;
	
      $profondeur[$parseur]++;
  
	    
      }// Fin fonction balise ouvrante
   
   
// *********************************************************** BALISE FERMANTE *******************************************************************************************
    function fonctionBaliseFermante($parseur, $nomBalise)
      {
        // On oublie la dernière balise rencontrée
        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";

		global $profondeur;
		global $balisefermante;
	  
	  $balisefermante=$nomBalise;
	  
		if ($balisefermante=="PRODUCTS") {exit;}

      $profondeur[$parseur]--;
      
      }//FIN balise fermante

	  
	  
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;
		global $id_produit;
		global $id_categorie;
		global $caracteristique;
		global $marchand;
		global $lien;
		global $logo;
		global $stock;
		global $prix;
		global $produit;
		global $marque;
		global $description;
		global $categorie;
		global $nombre_marchands;
		global $image;
		global $tarif_moins;
		

if (($derniereBaliseRencontree=="ID") && $profondeur[$parseur]==3) {$id_produit=$texte;}		
if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==3) {$produit=$texte;}
if (($derniereBaliseRencontree=="MANUFACTURER") && $profondeur[$parseur]==3) {$marque=$texte;}
if (($derniereBaliseRencontree=="DESCRIPTION") && $profondeur[$parseur]==3) {$description=$texte;}
if (($derniereBaliseRencontree=="CATEGORY") && $profondeur[$parseur]==3) {$categorie=$texte;}
if (($derniereBaliseRencontree=="CATEGORY-ID") && $profondeur[$parseur]==3) {$id_categorie=$texte;}		
if (($derniereBaliseRencontree=="NUMBER-OF-RETAILERS") && $profondeur[$parseur]==3) {$nombre_marchands=$texte;}
if (($derniereBaliseRencontree=="IMAGE-URL") && $profondeur[$parseur]==3) {$image=$texte;}
if (($derniereBaliseRencontree=="LOWEST-PRICE") && $profondeur[$parseur]==3) {$tarif_moins=$texte;}
if (($derniereBaliseRencontree=="HIGHEST-PRICE") && $profondeur[$parseur]==3) 
								{
								$table="comparateur";
								$query = 'INSERT INTO `'.$table.'` (`id_categorie`,`categorie`,`id_produit`,`produit`,`marque`,`description`,`image`,`nombre_marchands`,`tarif_moins`,`tarif_plus`) VALUES (\''.$id_categorie.'\', \''.$categorie.'\', \''.$id_produit.'\', \''.$produit.'\', \''.$marque.'\', \''.$description.'\', \''.$image.'\', \''.$nombre_marchands.'\', \''.$tarif_moins.'\', \''.$texte.'\');'; 
								$result = mysql_query($query);
								}
  
 // ********************************************************  ECRITURE CARACTERISTIQUES ************************************************************************** 
  
 if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==6) {$caracteristique=$texte;} 
  if (($derniereBaliseRencontree=="VALUE") && $profondeur[$parseur]==6) 
								{
								$table="comparateur_caracteristiques";
								$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$caracteristique.'\', \''.$texte.'\');'; 
								$result = mysql_query($query);
								}


//********************************************* ECRITURE MARCHANDS *******************************************************************************

if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==4) {$marchand=$texte;}
if (($derniereBaliseRencontree=="LINK") && $profondeur[$parseur]==4) {$lien=$texte;}
if (($derniereBaliseRencontree=="LOGO") && $profondeur[$parseur]==4) {$logo=$texte;}
if (($derniereBaliseRencontree=="STOCK-INFO") && $profondeur[$parseur]==4) {$stock=$texte;}
if (($derniereBaliseRencontree=="PRICE") && $profondeur[$parseur]==4) {$prix=$texte;}
if (($derniereBaliseRencontree=="PRICE-WITH-SHIPPING-MIN") && $profondeur[$parseur]==4) 
							{
							$table="comparateur_marchands";
							$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$marchand.'\', \''.$lien.'\', \''.$logo.'\', \''.$stock.'\', \''.$prix.'\', \''.$texte.'\');'; 
							$result = mysql_query($query);
							}


 
         
    }

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

 echo "LECTURE ACCOMPLI";
 
 mysql_close();	

?>

Cela commence à se préciser et à devenir intéressant.
A nous deux , je suis sur que l'on va optimiser tout ça :lol:
 
WRInaute occasionnel
C'est encore moi. Bon j'ai modifier ton script de façon à afficher tous les group. Je fais le test, toujours avec un fichier de 900 produits de 7Mo.
Je suis arrivé à un temps d'exécution de 20s avec insertion en bdd . Yessssssssssssssssssss , 10s de gagné encore.
Peut-être peut-on l'améliorer encore.
Maintenant mettre qu'une seule table au lieu de trois comme tu le suggères. Je ne vois pas trop comment l'organiser.
Merci en tout cas pour cette suggestion.


Code:
<?php

include 'bdd.php';

	  @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");
	   

$profondeur = array(); // profondeur des items
$tableau = array(); // tableau pour l'enregistrement des contenus

global $i;
global $j;
$i=1;
$j=1;

  $fichier = "fichier.xml";

// *********************************************************** BALISE OUVRANTE *******************************************************************************************
   
   function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
   global $profondeur;
   global $tableau;
  
     
   array_push( $profondeur, $nomBalise );
      
   if( count($tableauAttributs) > 0 )
   {
      $path = implode( "_", $profondeur );
      foreach( $tableauAttributs as $k => $v )
      {
	
         $tableau[$path."_".$k] = $v;
      }
   }
}   
   
function fonctionBaliseFermante($parseur, $nomBalise)
{
   global $profondeur;
   global $tableau;
   global $i;
   global $j;

   if ($nomBalise=="PRODUCT")
   {
      //print_r( $tableau );
			$table="comparateur";
			$query = 'INSERT INTO `'.$table.'` (`id_categorie`,`categorie`,`id_produit`,`produit`,`marque`,`description`,`image`,`nombre_marchands`,`tarif_moins`,`tarif_plus`) VALUES (\''.$tableau['PRODUCTS_PRODUCT_CATEGORY-ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_CATEGORY'].'\', \''.$tableau['PRODUCTS_PRODUCT_ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_NAME'].'\', \''.$tableau['PRODUCTS_PRODUCT_MANUFACTURER'].'\', \''.$tableau['PRODUCTS_PRODUCT_DESCRIPTION'].'\', \''.$tableau['PRODUCTS_PRODUCT_IMAGE-URL'].'\', \''.$tableau['PRODUCTS_PRODUCT_NUMBER-OF-RETAILERS'].'\', \''.$tableau['PRODUCTS_PRODUCT_LOWEST-PRICE'].'\', \''.$tableau['PRODUCTS_PRODUCT_HIGHEST-PRICE'].'\');'; 
			$result = mysql_query($query);
				
			$table="comparateur_caracteristiques";
			for($nbrs_carac=1;$nbrs_carac<$i;$nbrs_carac+=1) 
				{
			$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$tableau['PRODUCTS_PRODUCT_ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_CATEGORY-ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME_'.$nbrs_carac].'\', \''.$tableau['PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE_'.$nbrs_carac].'\');'; 
			$result = mysql_query($query);	
				}
				
			$table="comparateur_marchands";	
			for($nbrs_mag=1;$nbrs_mag<$j;$nbrs_mag+=1) 
				{			
			$query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$tableau['PRODUCTS_PRODUCT_ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_CATEGORY-ID'].'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_NAME_'.$nbrs_mag].'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_LINK_'.$nbrs_mag].'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_LOGO_'.$nbrs_mag].'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_STOCK-INFO_'.$nbrs_mag].'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_PRICE_'.$nbrs_mag] .'\', \''.$tableau['PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN_'.$nbrs_mag].'\');'; 
			$result = mysql_query($query);
				}
  
      $tableau=array();
	  $i=1;
		$j=1;
    }
     
     
   array_pop( $profondeur );
}   
   

function fonctionTexte($parseur, $texte)
{
   global $profondeur;
   global $tableau;
    global $i;
	global $j;


   $path = implode( "_", $profondeur );
   
   if ($path=="PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME") {$path="PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME_".$i;}
   if ($path=="PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE") {$path="PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE_".$i;$i++;}
   
   if ($path=="PRODUCTS_PRODUCT_RETAILER_NAME") {$path="PRODUCTS_PRODUCT_RETAILER_NAME_".$j;}
   if ($path=="PRODUCTS_PRODUCT_RETAILER_LINK") {$path="PRODUCTS_PRODUCT_RETAILER_LINK_".$j;}
   if ($path=="PRODUCTS_PRODUCT_RETAILER_LOGO") {$path="PRODUCTS_PRODUCT_RETAILER_LOGO_".$j;}
   if ($path=="PRODUCTS_PRODUCT_RETAILER_STOCK-INFO") {$path="PRODUCTS_PRODUCT_RETAILER_STOCK-INFO_".$j;}
   if ($path=="PRODUCTS_PRODUCT_RETAILER_PRICE") {$path="PRODUCTS_PRODUCT_RETAILER_PRICE_".$j;}
   if ($path=="PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN") {$path="PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN_".$j;$j++;}
 
   $tableau[$path] = $texte;
} 
   

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {
	
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

 echo "LECTURE ACCOMPLI";
 
?>
 
WRInaute impliqué
voici plutot comment j'aurais vu les choses au niveau de la gestion des balises xml multiples
là dans cette version c stocker dans un tableau
du coup quand tu sais que tu n'as qu'une seule valeur c'est de rajouter [0]
sinon si c'est un attribut multiple, il suffit de lire les n valeurs dans le tableau

pour faire qu'une seule requête, regarde le code en dessous, cela veux entraine un explode lors que tu vas lire les données multiples; à voir si tu peux t'en sortir ainsi sauf que là c'est optimale en terme de requete et de coup de traitement

a+


Code:
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
	global $profondeur;
	global $tableau;
     
	array_push( $profondeur, $nomBalise );
		
	if( count($tableauAttributs) > 0 )
	{
		$path = implode( "_", $profondeur );
		foreach( $tableauAttributs as $k => $v )
		{
			$tableau[$path."_".$k][] = $v;
		}
	}
}    
   
function fonctionBaliseFermante($parseur, $nomBalise)
{
	global $profondeur;
	global $tableau;

	if ($nomBalise=="PRODUCT")
	{
         $query = "INSERT INTO `'.$table.'` (
         `id_categorie`,
         `categorie`,
         `id_produit`,
         `produit`,
         `marque`,
         `description`,
         `image`,
         `nombre_marchands`,
         `tarif_moins`,
         `tarif_plus`,
         `caracteristique`,
         `valeur_caracteristique`,
         `marchand`,
         `lien`,
         `logo`,
         `stock`,
         `prix`,
         `prix_frais_port`
         ) VALUES (
         '".$tableau['PRODUCTS_PRODUCT_CATEGORY-ID'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_CATEGORY'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_ID'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_NAME'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_MANUFACTURER'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_DESCRIPTION'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_IMAGE-URL'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_NUMBER-OF-RETAILERS'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_LOWEST-PRICE'][0]."', 
         '".$tableau['PRODUCTS_PRODUCT_HIGHEST-PRICE'][0]."',
         '".implode( "|", $tableau['PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME'])."', 
         '".implode( "|", $tableau['PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE'])."'
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_NAME'])."',
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_LINK'])."',
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_LOGO'])."',
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_STOCK-INFO'])."',
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_PRICE'])."',
		 '".implode( "|", $tableau['PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN'])."'
         );";
         $result = mysql_query($query);
            
		$tableau=array();
    }
      
	array_pop( $profondeur );
}   
    

function fonctionTexte($parseur, $texte)
{
	global $profondeur;
	global $tableau;

	$path = implode( "_", $profondeur );
      
	$tableau[$path][] = $texte;
}
 
Discussions similaires
Haut