IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tableau à plus de deux dimensions avec éléments à index automatique


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Tableau à plus de deux dimensions avec éléments à index automatique
    Bonjour,

    Peut-être la réponse à ma question se trouve sur le forum mais vu le nombre de posts, difficile de la retrouver...

    Voilà le contexte: je souhaite créer un tableau multidimensionnel dont certains éléments, contenant eux-mêmes des éléments simples ou des tableaux, peuvent être utilisés comme des tableaux à index automatique du genre "$toto['tutu'][] = (valeurs)" ou "$toto['tutu'][] => (valeurs)' ou même, si possible, "$toto['tutu'][]['titi'] => (valeur)".
    Pour un exemple concret, voici mon but : générer un fichier de commandes SQL permettant de créer une base de données MySQL (ou autre type de bases de données acceptant ce type de fichiers batch) et de la remplir avec des données extraites d'un formulaire et de fichiers texte existants.
    Les données élémentaires pour la création de la base sont assez classiques:

    1. Serveur, utilisateur, mot de passe
    2. Nom de la base, Character set
    3. Plusieurs tables

    C'est le point 3 qui me pose problème. Comme je ne connais pas dès le départ le nombre de tables nécessaires qui, selon l'organisation souhaitée, peuvent être deux ou trois, je souhaite avoir un élément «table» qui soit un tableau indexable comportant un élément simple «nom de la table» et un tableau vide «liste des champs».
    Je crains que le problème principal dans tout ça soit la manière dont j'écris mon script PHP. Comme j'ai une formation déjà ancienne de programmeur, ma tendance immédiate est de créer des «gabarits», des variables typées et structurées. Dans le cas précis, ma variable est définie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $fstrs = array (
      'my_data' => array ('my_serv' => 'default', 'my_user' => 'default', 'my_pass' => 'default'),
      'db_data' => array ('db_name' => 'default', 'db_cset' => 'default', 'db_ccol' => 'default')
      );
    Il y a bien sûr un troisième élément 'tb_data', que j'ai tenté de définir de plusieurs manières, celle actuelle étant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      'tb_data' => array ( array( 'tb_file' => 'default', 'tb_field' => array ()))
    Quelle que soit la manière dont j'ai tenté de définir cet élément, de la plus simple à la plus complexe, le problème reste le même: le «gabarit» ne pose pas de problème à l'interpréteur, un «var_dump» sur $fstrs s'exécute correctement, mais dès que j'essaie de créer, modifier ou simplement lire le contenu de «tb_data», aucune syntaxe ne semble convenable, le script bloque et n'affiche plus rien.
    J'ai donc deux questions, en espérant que la première trouve une réponse positive:

    1. Y a-t-il moyen de définir un gabarit pour «tb_data» tel qu'on puisse par la suite créer ou lire des éléments ['tb_data'][0]['tb_file'], ['tb_data'][0]['tb_field'][0], ['tb_data'][1]['tb_field'][0], ['tb_data'][1]['tb_field'][1], etc. ?
    2. Si non, quelle serait la syntaxe pour créer dynamiquement une telle structure ?

    Merci d'avance pour toute réponse et bien entendu, si aucune de ces deux possibilités n'est envisageable, merci d'avance pour toute suggestion.

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Bonjour, suis pas sûre d'avoir tout compris.
    Mais si tu as un fichier .csv avec ce genre de données

    serveur1;user1;pwd1;db1;utf-8;tables;table1;table2;table3
    serveur2;user2;pwd2;db2;latin1;tables;toto

    Et que tu veux obtenir ce genre de tableau dynamique en PHP

    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
    Array
    (
        [0] => Array
            (
                [server] => serveur1
                [user] => user1
                [pwd] => pwd1
                [db_name] => db1
                [charset] => utf-8
                [tables] => Array
                    (
                        [0] => table1
                        [1] => table2
                        [2] => table3
     
                    )
     
            )
     
        [1] => Array
            (
                [server] => serveur2
                [user] => user2
                [pwd] => pwd2
                [db_name] => db2
                [charset] => latin1
                [tables] => Array
                    (
                        [0] => toto
                    )
     
            )
     
    )
    Ce code fonctionne. C'est dynamique et j'avoue ne pas comprendre ton concept de gabarit.

    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
    $data=array();
    $handle = fopen("./tmp/tonfichier.csv", "r");
    if ($handle) {
        while (($line = fgets($handle, 4096)) !== false){
    		$temp=explode('tables;',$line);
    		$tech=explode(';',$temp[0]);
    		$tables=explode(';',$temp[1]);
            $row=array();
    		$row['server']=$tech[0];
    		$row['user']=$tech[1];
    		$row['pwd']=$tech[2];
    		$row['db_name']=$tech[3];
    		$row['charset']=$tech[4];
    		$row['tables']=$tables;
    		$data[]=$row;
        }
        if (!feof($handle)) {
            echo "Erreur: fgets() a échoué\n";
        }
        fclose($handle);
    }
    echo '<pre>';
    print_r($data);
    echo '</pre>';

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette première réponse, Dendrite, je vais mieux l'étudier demain – là c'est l'heure de jouer un peu avant de se coucher
    Pour les gabarits, ça correspond à l'anglais «pattern» : un variable peut avoir un type explicite ou implicite et dans le cas d'une variable typée autre que simple (entier, réel, caractère, pointeur...) il faut créer un gabarit, c'est-à-dire une définition explicite de sa forme. J'ai bien l'impression qu'il va me falloir me départir de mes habitudes et me décider à utiliser une variable où les éléments seront définis et créés à la volée. Faudra que je m'y fasse

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Faudra bien s'y faire...
    Merci encore à Dendrite.

    J'ai fini par résoudre mon problème en... me résolvant à changer mes habitudes !

    Visiblement, en PHP il est plus efficace et plus simple de créer dynamiquement ses variables que de tenter de les définir préalablement, d'autant qu'il semble impossible ou très compliqué de créer un gabarit pour un tableau multidimensionnel assez complexe, qui mêle indexations automatiques et tableaux associatifs. Du coup, les tableaux de données sont désormais générés au fur et à mesure de la récupération des valeurs des variables de mon formulaire, des variables locales et des données de mes fichiers texte.

    Faut dire ce qui est, pas facile pour un programmeur habitué à la programmation structurée avec des variables bien typées de travailler comme ça mais bon, si je veux pouvoir écrire ou corriger les scripts qui feront tourner mon site maison sous PHP, faudra bien s'y faire...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2011, 15h50
  2. [Lazarus] Un tableau à deux dimensions, avec recherche
    Par Alea46 dans le forum Lazarus
    Réponses: 10
    Dernier message: 04/11/2010, 23h42
  3. tableau deux dimension avec STL
    Par adel25 dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/06/2009, 17h09
  4. [C#] - Remplir tableau à deux dimensions avec split
    Par dada4444 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/05/2009, 10h26
  5. tableau dynamique de deux dimensions
    Par lecamer dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 31/07/2008, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo