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 :

Switch case compliqué


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Switch case compliqué
    Bonjour, je suis un débutant en programmation, vraiment très débutant et je suis confronté à un problème. Voila j'ai créé un programme PHP qui est censé lire un fichier CSV. De ce côté tout se passe bien mais ensuite en fonction de ce que je lis je dois faire des instructions. Par exemple voici quelques lignes parmi les nombreuses de mon fichier :

    "Sacs en Papier","Sac Papier - poignées plates","DPL002","80 grs Blanc","22 + 10 x 31 cm","blanc","€ 0,19","1","doos","250","1"
    "Sacs en Papier","Sac Papier - poignées plates","DPL001","80 grs brun","22 + 10 x 31 cm","brun","€ 0,19","1","doos","250","1"
    "Sacs en Plastique",,"DQU007","Poly","30 x 36 cm","Semi Transparant","€ 0,14","1","doos","500","1"
    "Sacs en Plastique",,"DQU194","Blanc poly","45 x 51 + 2 x 5 cm","Soldes","€ 0,18","1","stuk","500","1"
    "Sacs PP Tissés","Big Shopper PP Tissé","DQP006","tissé PP","45 + 18 x 48 cm","Noir","€ 1,65","1","doos","100","1"
    "Sacs PP Tissés","Big Shopper PP Tissé","DQP001","tissé PP","45 + 18 x 48 cm","Blanc","€ 1,65","1","doos","100","1"
    sur la première colonne il y a des noms de catégories, j'aimerai faire un switch case sur ces noms par exemple quand le nom Sacs en Papier apparaît je souhaiterai faire des instructions une seule fois pour toutes les lignes qui ont ce nom. Seulement j'ai essayé de m'y mettre mais rien ne marche..... il m'affiche plus de 90 fois le même nom :S

    Si quelqu'un peut m'aider je laisse mon programme pour qu'il y voit plus clair :

    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
    <?php
    $row = 1;
    if (($handle = fopen("FF-Webshop-F.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);
            $row++;
            for ($c=0; $c < $num; $c++) {
    			$ligne = fgets($handle, 1000);
    			$liste = explode(",", $ligne);
     
    			$liste += array_pad(array(), 11, null);
    			ksort($liste);
    			/*var_dump($liste[0]);*/
    			$liste[0] = str_replace('"', '', $liste[0]);
    			switch($liste[0]){
     
    				case "Sacs en Papier":
    				echo "pouet <br />\n";
    				break;
     
    				case "Sacs en Plastique":
    				echo "pouet2";
    				break;
     
    			}
            }
        }
        fclose($handle);
    }
    ?>
    PS : Les deux echos dans les deux case sont juste des test je sais ce que je dois mettre dans mes case j'ai déjà préparé ça sur papier.

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    j'aimerai faire un switch case sur ces noms par exemple quand le nom Sacs en Papier apparaît je souhaiterai faire des instructions une seule fois pour toutes les lignes qui ont ce nom
    je ne vois pas vraiment l'interet algorithmique... ça demanderai que ton csv soit trié.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Je sais mais c'est mon maitre de stage qui m'a dit de faire ça. En fait ce que je cherche à faire c'est par exemple quand mon programme lis les 100 premières lignes du fichier et qu'il voit Sacs en Papier, je voudrais qu'il fasse une requête en disant que ce nom est égal à un nouvel id dans ma bd. Mais je veux qu'il ne le fasse qu'une fois car les 100 première lignes ont le même nom donc elles ont le même id.

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ok je te donne un meilleur algo.

    comme ça je ne fait qu'un seule traitement pour les "sac en papier"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $cache = array() 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
     
    if ( isset( $cache[$data[0]] ) ){
     $cache[$data[0]]++;
     echo 'rencontre ', $data[0], 'pour la ', $cache[$data[0]], ' fois';
    }
    else {
     echo 'premiere fois qu\'on lit ', $data[0];
     $cache[$data[0]]=1;
    }
    }
    Ensuite tu peux récupérer un id au lieu d'afficher le message et ensuite l'avoir dans le cache pour faire la requete d'insertion dans la base...

    Sinon tu as une option full SQL:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ... 
    SELECT :speudocolonne1,:speudocolonne2,id 
     FROM table 
     WHERE cond = :condition
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    En fait mon programme lit bien le fichier car quand j'ai fait un var_dump($liste[0]);, j'ai tous les noms présents dans mon fichier qui s'affichent. Maintenant ce que je cherchais à faire avec mon switch c'était si il avait ce nom il fait ça une fois peut un porte qu'il y ait 100 le même nom et si il y a une autre nom il fait ça et là aussi peut importe le nom vu qu'il ne le ferra qu'une fois

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    c'est pas clair ton truc.. mais si j'ai bien compris... j'ai résolu ton pb.

    un ptit clic sur
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Je vais t'expliquer mieux que ça, dans mon fichier CSV j'ai environ 300 lignes. La première colonne c'est un nom de catégorie de produit. Je dois faire en sorte premièrement de créer ces différentes catégories. Seulement dans ma base de données il y a une table qui contient un id_category qui est incrémenté donc en premier je dois créer l'id la dessus pas de soucis j'ai déjà ma requête de prête. Ensuite après avoir créé cette catégorie je dois lui donner un nom dans la base or ce n'est pas dans la même table. (Je précise que la base que l'on m'a fourni n'a que des relation du style n-n). Donc ce que je cherchais à faire dans mon programme, c'est de lire mon fichier et ensuite de dire avec un switch case si lors de la lecture tu trouves le nom Sacs en Papier et même si il est répété 100 fois de suite tu insert dans la table le nouvel id_category qui peut être par exemple 12, mais tu ne insert qu'une fois vu qu'il y a 100 fois le même nom ça ne sert à rien de créer 100 un id pour le même nom. Ensuite je fais une autre requête où je récupère le dernier id inséré et je l'insert avec le nom qui correspond dans la deuxième table. Et je fais ça à chaque fois qu'il tombe sur un nouveau nom (je sais ça à l'air idiot et rébarbatif mais c'est mon sujet et je ne peux pas faire autrement). J’espère que je t'ai mieux éclairé cette fois-ci.

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    oui je me disais bien que tu n'avais rien compris.
    reprenons le code, en ajoutant le commentaire.

    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
    $cache = array() 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
     
    if ( isset( $cache[$data[0]] ) ){
     $idCategorie = $cache[$data[0]];
    }
    else {
     echo 'premiere fois qu\'on lit ', $data[0];
     // on va chercher l'ID dans la table avec la requete
     // et on dit que le résultat est dans $id
     // $baseDeDonnée c'est l'objet/la ressource qui désigne la bd.   
     $idCategorie=chercher_dans_base_donnee_par_categorie($baseDeDonnee, $data[0]);
     $cache[$data[0]]=$idCategorie;
    }
     
     // traitement normal valable pour toutes les lignes du fichier
     // l'id de la catégorie est stocké dans $idCategorie (et dans $cache[$data[0]])
     faire_traitement_par_ligne($baseDeDonnee,$idCategorie,$data);
    }//while
    évidement chercher_dans_base_donnee_par_categorie() va chercher l'id dans la bd et tu le crées si tu ne le trouve pas. autre débat.

    faire_traitement_par_ligne() est optionnel.

    tu comprends mieux pourquoi j'ai nommé la variable $cache et non $compteur ?

    ?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

Discussions similaires

  1. [Language]Probleme de switch case
    Par nana1 dans le forum Langage
    Réponses: 20
    Dernier message: 17/11/2005, 00h49
  2. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20
  3. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  4. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

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