Page 1 sur 1

Création de tableau dynamique

Posté : 22 nov. 2012, 18:15
par romain081
Bonjour,
Je suis nouveau, je viens donc vous solliciter afin d'avoir un petit coup de main :)

Dans le cadre de la mise en place d'une solution de supervision des imprimantes Brother. Je me suis tourné vers la récupération et l'analyse des fichiers CSV proposé par les imprimantes.


Le problème rencontré est le suivant : Il faut que je puisse créer un tableau de façon dynamique (je ne connais pas a l'avance la taille finale du tableau), mais que chaque imprimante puisse avoir son propre tableau avec un nom sous la forme tab_$IP.

Voici le code :
function traitement($ip, $url){
        $page=fopen("info.html","a"); //ouverture de info.html en mode Ajout
        $f = fopen("test.csv", "r"); // Ouverture du fichier CSV téléchargé
        $IP=$ip;
        $detection_ligne=0;
        $NBCOL=0;
        while (($line = fgetcsv($f, 0, ",")) !== false) {
                /* Tant qu il y a une ligne du type CSV avec pour séparateur ','
                et d'une longueur maximale 0 (=infini) on met dans le tableau $line
                le contenu */

                $page1=fwrite($page, "\n<tr>\n"); //On débute la ligne
                        foreach ($line as $cell) {
                                $ip_temp=str_replace(".","_",$IP);
                                // pour chaque cellule du tableau $line
                                if($detection_ligne=='0'){
                                        //Grâce a la detection de ligne on peut savoir si la ligne en question est une tête de colonnes
                                        ${'$tab_'.$IP.'['.$detection_ligne.']['.$NBCOL.']='.$cell};
                                        $page1=fwrite($page, "\t<td bgcolor='#FFF48D'><font size=2>".$cell."</font></td>\n"); // on le met dans un <td>...</$

                                }
                                else
                                {
                                        $page1=fwrite($page, "\t<td><font size=2>".$cell."</font></td>\n"); // on le met dans un <td> ... </td>
                                        ${'$tab_'.$IP.'['.$detection_ligne.']['.$NBCOL.']='.$cell};
                                }
                                $NBCOL=$NBCOL+1;
                        }
                $page1=fwrite($page, "</tr>\n"); // On termine la ligne
                $detection_ligne=1;
        }
        fclose($f);
        fclose($page);
}
Merci de votre lecture

Re: Création de tableau dynamique

Posté : 22 nov. 2012, 19:46
par xTG
Pour s'emmerder avec des variables dynamiques au lieu d'utiliser des index ?
$tab[$IP][$detection_ligne][$NBCOL];

Re: Création de tableau dynamique

Posté : 22 nov. 2012, 19:50
par Saian
Tu peux tout stocker dans le même tableau avec 2 niveaux :
// création du tableau
$printers = array();

// dans la boucle
// création de l'index spécifique à l'imprimante si n'existe pas
if(!isset($printers['tab_'.$IP]))
  $printers['tab_'.$IP] = array();
// ajout de données dans le tableau
$printers['tab_'.$IP][] = $element_to_add;

// et vraiment si tu veux une variable séparée pour chaque imprimante à la fin tu peux faire
foreach($printers as $i => $printer)
  ${$i} = $printer;// création des variables $tab_IP1, $tab_IP2, $tab_IP3, ...
Voila je pense qu'avec ça tu as tout ce qui faut pour faire ce que tu veux.

Re: Création de tableau dynamique

Posté : 23 nov. 2012, 09:18
par romain081
Pour s'emmerder avec des variables dynamiques au lieu d'utiliser des index ?
$tab[$IP][$detection_ligne][$NBCOL];

Je pense que je vais prendre cette solution qui finalement me parait la plus simple. Et fonctionnelle.

Donc pour mettre la valeur dans la case j'ai juste a faire :

$tab[$IP][$detection_ligne][$NBCOL]=$cell;
(Je ne savais pas que l'on pouvait faire des tableau tri-dimensionnel)

Par contre je voudrais avoir un peu plus d'information pour la création d'un tableau excel avec ces tableau.

Re: Création de tableau dynamique

Posté : 23 nov. 2012, 10:50
par Saian
Personnellement j'écrirais un truc du style :
$printers = array();// initialisation du tableau des imprimantes
function traitement($ip, $url){
  $printers[$ip] = array();// initialisation de l'index de l'imprimante
  while (($line = fgetcsv($f, 0, ",")) !== false) {
    $printers[$ip][] = $line;// stocke la ligne qui est un tableau
  }
}

// Pour créer un csv par imprimante
foreach($printers as $ip => $lines) {// boucle sur les imprimantes
  $content = array();// initialisation du contenu du csv
  foreach($lines as $cells)// boucle sur les lignes de l'imprimante
    $content[] = implode(';', $cells);// construction de la ligne au format csv séparateur ;
  file_put_contents('printer-'.$ip.'.csv', implode("\n", $content));// écriture du fichier csv en injectant toutes les lignes séparées par \n
}

Re: Création de tableau dynamique

Posté : 23 nov. 2012, 12:28
par romain081
Après je pensais faire un dossier par imprimante ayant pour nom l'adresse IP, et ces dossiers dans un dossier parant qui porte le nom du modèle.

A savoir que les fichiers CSV retourné par les imprimantes sont constitués de deux lignes : Une ligne avec l'intitulé des champs et l'autre avec les valeurs des champs.

Voici un extrait du fichier IP que je me sert pour disocier les différents modèles :

Code : Tout sélectionner

(MFC-7820N) 111.21 202.22 204.21 208.21 209.20 210.21 211.21 229.25 234.21 223.21 -- (MFC-8460N) 101.20 121.20 -- (HL-4050CDN) 11.18 -- (MFC-7225N) 213.22 -- (MFC-7440N) 221.22 -- (MFC-8880DN) 229.21 -- (MFC-8370DN) 229.24 --
Sachant que entre parenthèses nous trouvons le noms du modèles puis les adresses ip (ici volontairement réduites au deux derniers octets) puis deux tiret indiquant la fin d'une section.

Je viens d'ajouter un test de ping pour éviter les erreurs de traitements. Mais il faut que je puisse garder les anciens fichiers CSV, afin d'afficher les anciennes données si elles n'ont pas pu être actualiser.

En tout cas merci de vos réponses :D