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 :

Gestion de stock et preg_replace [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Gestion de stock et preg_replace
    Bonjour,

    Je développe un petit webservice de type REST où les options produit sont stockées sous la forme : 10-251,11-197,18-249

    Pour mettre à jour ce produit, je dois remplacer par exemple la sous-chaine 11-197 par 20-202.

    La difficulté vient du fait que cette sous-chaine peut être au début, au milieu ou à la fin de la chaine principale.

    Ma première idée a été de décomposer en plusieurs regex pour chaque cas de figure et cela fonctionne.

    Cependant je suis un peu rouillé dans ce domaine, et ce n'est sans doute pas optimisé. Comment feriez-vous de votre coté ?

    Edit : j'ai pu simplifier déjà un peu les patterns

    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
     
    // batterie de test
    $stringa = '11-1978';
    $stringb = '211-197';
    $string1 = '11-197';
    $string2 = '11-197,18-249';
    $string3 = '10-251,11-197,11-1977';
    $string4 = '411-197,18-249,11-197';
    $string5 = '10-251,11-1972,11-197,811-197';
     
    $patterns = array();
    $patterns[] = '/^11-197$/';
    $patterns[] = '/^11-197,/';
    $patterns[] = '/,11-197,/';
    $patterns[] = '/,11-197$/';
     
    $replacements = array();
    $replacements[] = '20-202';
    $replacements[] = '20-202,';
    $replacements[] = ',20-202,';
    $replacements[] = ',20-202';
     
    echo preg_replace($patterns, $replacements, $stringa); echo '<br/>';
    echo preg_replace($patterns, $replacements, $stringb); echo '<br/>';
    echo preg_replace($patterns, $replacements, $string1); echo '<br/>';
    echo preg_replace($patterns, $replacements, $string2); echo '<br/>';
    echo preg_replace($patterns, $replacements, $string3); echo '<br/>';
    echo preg_replace($patterns, $replacements, $string4); echo '<br/>';
    echo preg_replace($patterns, $replacements, $string5);

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    c'est clair y'a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $haystack = '10-251,111-1977,11-197,18-249';
    $needle   = '11-197';
    $replaced = '20-202';
    echo str_replace(array("$needle,", ",$needle,", ",$needle"), array("$replaced,", ",$replaced,", ",$replaced"), $haystack);
     
    ?>
    La seule condition c'est de bien avoir des valeurs sans aucun espace sinon il fadrait les retirer avant le traitement.

  3. #3
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de cette réponse, mais ce code ne fonctionne pas dans plusieurs des cas testés par le bout de code :

    - 1 seule option ($string1)
    - 1 seule option : pas de remplacement si chiffre par devant ($stringa)
    - 1 seule option : pas de remplacement si chiffre derrière ($stringb)
    - plusieurs options : pas de remplacement si chiffre par devant ($string4)
    - plusieurs options : pas de remplacement si chiffre par derrière ($string3)

    C'est important puisqu'il s'agit de couples "option_id - value_id"

    Voici une sortie OK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    11-1978
    211-197
    20-202
    20-202,18-249
    10-251,20-202,11-1977
    411-197,18-249,20-202
    10-251,11-1972,20-202,811-197
    Il me semble que le preg_replace est nécessaire pour repérer le début et la fin de chaine. Je pensais simplement que l'on pouvait peut-être tout regrouper dans 1 seul pattern.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Ne me remercie pas quand je me suis sèchement lourdé

    Bon ce coup-ci ça devrait gazer sans regex :
    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
    <?php
     
    $data = array(
       '11-1978',
       '211-197',
       '11-197',
       '11-197,18-249',
       '10-251,11-197,11-1977',
       '411-197,18-249,11-197',
       '10-251,11-1972,11-197,811-197'
    );
     
     
    $needle   = '11-197';
    $replaced = '20-202';
    $clean    = array();
     
    foreach($data as $haystack) {
       $nums = explode(',', $haystack);
       $temp = array();
       array_map(
          function($p) use ($needle, $replaced, &$temp) {
             $temp[] = ($p === $needle) ? $replaced : $p;
          }, $nums
       );
       $clean[] = implode(',', $temp);
    }
     
    $out = array(
       '11-1978',
       '211-197',
       '20-202',
       '20-202,18-249',
       '10-251,20-202,11-1977',
       '411-197,18-249,20-202',
       '10-251,11-1972,20-202,811-197'
    );
     
    $nb = count($data);
    echo '<pre>';
    for($i = 0; $i < $nb; ++$i) {
       echo 'in    : ', $data[$i], '<br />', 'out   : ', $out[$i], '<br />', 'clean : ', $clean[$i], '<br />';
    }
     
    ?>
    Et je t'ai mis le code de test qui va avec.

  5. #5
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ok, donc si j'ai bien compris, pas de regex si on peut faire sans.

    J'en vois beaucoup dans le code source sur lequel je travaille et j'ai fini par penser que c'était mieux.

    Edit : Je viens de tester sur un produit réel et le temps d'exécution est divisé par plus de 2

    Edit 2 : Ouille le serveur de production est en php 5.1.6 donc pas de use.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Yohgars Voir le message
    Edit : Je viens de tester sur un produit réel et le temps d'exécution est divisé par plus de 2
    Bah c'est plutôt normal, les regex gèrent la complexité syntaxique très synthétiquement mais cela a un certain coût en terme de performance.

    Citation Envoyé par Yohgars Voir le message
    Edit 2 : Ouille le serveur de production est en php 5.1.6 donc pas de use.
    Pas de problème, tu peux aussi faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach($data as $haystack) {
       $nums = explode(',', $haystack);
       $temp = array();
       foreach($nums as $num) {
          $temp[] = ($num === $needle) ? $replaced : $num;
       }
       $clean[] = implode(',', $temp);
    }

  7. #7
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'avais trouvé comment faire pour php5.1.6.

    Cette fois ci je peux dire merci, je crois et même résolu.

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

Discussions similaires

  1. Gestion de stock : Formule en section Détail
    Par JeremieT dans le forum IHM
    Réponses: 4
    Dernier message: 16/12/2005, 18h02
  2. Gestion de stock CMUP après chaque entrée
    Par priest69 dans le forum Access
    Réponses: 9
    Dernier message: 13/12/2005, 11h03
  3. Gestion de stock - Prix Moyen Pondéré
    Par hugo69 dans le forum Access
    Réponses: 33
    Dernier message: 28/10/2005, 18h03
  4. Analyses du progiciel de gestion de stock COSWIN CS 5.2
    Par africanroseonlyone dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/10/2005, 16h01
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 12h41

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