Bonjour,
Pour commencer je construis un tableau multidimensionnel qui se rempli de données en provenance de flux XML, en même temps qu'ils sont parcourus.
Mon tableau se présente comme ceci :
Voici mon script:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 $t_references = array ( $v_nom_flux => array ( "nb_occurences" => $v_occurences, "nb_total_docs" => $v_total_documents ) );
Pour précision : le tableau t_details reprend l'ensemble des flux avec leur nom et la quantité de documents contenus,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 //Parcours du répertoire $v_repertoire = @opendir($v_URL); while(FALSE !== $v_fichier = @readdir($v_repertoire)){ //Stocker le contenu du répertoire dans un tableau //Trier le contenu du répertoire dans l'ordre alphabétique $t_tri[] = "$v_fichier"; sort($t_tri); } foreach($t_tri as $v_fichier){ //Pour chaque flux //Tester le rejeux du flux (numéro du flux commence par 0?) if(substr("$v_fichier", -5, 1) == 0 && $v_fichier != '.' && $v_fichier != '..'){ //ne faites pas attention à ce contrôle, il est OK $v_chemin = $v_URL_factures.DIRECTORY_SEPARATOR.$v_fichier; $o_xml = simplexml_load_file($v_chemin); //extraire le nom complet du flux et le stocker $v_nom_long_flux = $o_xml->FLX_REF; //extraire le nombre d'éléments du flux et le stocker $v_nb_docs = $o_xml->NBR_ELT; //extraire le nom court du flux et le stocker (retirer les 22 derniers caractères) $v_nom_court_flux = substr("$v_nom_long_flux", 0, -22); //Alimenter les variables tableaux $v_nom_flux = "$v_nom_court_flux"; $v_nom_complet = "$v_nom_long_flux"; $v_nb_elements = $v_nb_docs; //Jusqu'ici tout est OK, mais je vous l'ai mis pour que vous ayez une vision globale... au cas où vous en auriez besoin. Et si ça peut aider aussi! =) //Ajouter le tout premier flux directement dans le tableau vide if(key($t_references)== NULL ){ $v_total_documents = $v_nb_docs; $v_ajout = array ( "nb_occurences" => 1, //il apparait donc une fois "nb_total_docs" => $v_total_documents ); $t_references["$v_nom_flux"]=$v_ajout; }else{ $v_index = key($t_references); while($v_nom_flux = current($t_references)){ //Si le nom est déjà présent dans le tableau : modification if(strcasecmp($v_index, $v_nom_court_flux) == 0){ $v_occurences = $v_occurences + 1; $v_total_documents = $v_total_documents + $v_nb_docs; //modifier un flux de données dans le tableau $v_modification = array ( "nb_occurences" => $v_occurences, "nb_total_docs" => $v_total_documents ); $t_references[key($t_references)] = $v_modification; break; //Si le nom n'est pas présent dans le tableau : ajout }else{ $v_compteur++; next($t_references); } } //Traitement si le nom pas présent dans le tableau If($v_compteur > 0){ $v_nom_flux = $v_nom_court_flux; $v_total_documents = $v_nb_docs; //ajouter le flux de données à la fin du tableau de références $v_ajout = array ( "nb_occurences" => 1, "nb_total_docs" => $v_total_documents ); $t_references["$v_nom_flux"]=$v_ajout; } } //stocker tous les flux rencontrés $v_ajout = array ( "nb_elements" => $v_nb_elements ); $t_details["$v_nom_complet"] = $v_ajout; } } echo "Données agrégées : <br/>"; var_dump($t_references); echo "<br/> Détails : <br/>"; var_dump($t_details);
et le tableau t_references regroupe les informations pour chaque type de flux
Voici ce que ce script me donne comme résultat:
Donc en gros il me fait bien le calcul une fois quand le flux existe déjà, puis pour les suivants, il écrase les données... en tout cas je le comprends comme ça. Mais je ne vois pas trop ce qui pêche dans mon script...Données agrégées :
array(3) { ["fichier_type1"]=> array(2) { ["nb_occurences"]=> int(2) ["nb_total_docs"]=> int(7566) } ["fichier_type2"]=> array(2) { ["nb_occurences"]=> int(1) ["nb_total_docs"]=> object(SimpleXMLElement)#94 (1) { [0]=> string(4) "1436" } } ["fichier_type3"]=> array(2) { ["nb_occurences"]=> int(1) ["nb_total_docs"]=> object(SimpleXMLElement)#1 (1) { [0]=> string(4) "2360" } } } //devrait être égal à 12310
Détails :
array(6) { ["fichier_type1_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#98 (1) { [0]=> string(4) "4995" } } ["fichier_type1_00002"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#97 (1) { [0]=> string(4) "2571" } } ["fichier_type2_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#94 (1) { [0]=> string(4) "1436" } } ["fichier_type3_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#89 (1) { [0]=> string(4) "4991" } } ["fichier_type3_00002"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#90 (1) { [0]=> string(4) "4959" } } ["fichier_type3_00003"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#1 (1) { [0]=> string(4) "2360" } } }
Partager