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 :

[Optimisation] Vérification motifs dans chaîne


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut [Optimisation] Vérification motifs dans chaîne
    Bonjour all !

    Je cherche à améliorer un micro algo de rien du tout dont je me sers actuellement. Parce qu'il comporte 2 boucles et dès que les chaîne sont trop longue, ça capote ^^

    Voici la fonction :
    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
    $sentence = "06 00 52 44 10 96 85";
    $keyWords = array('06', '96', '12','44');
     
    fonc($sentence, $keyWords);
     
    function fonc($sentence, $keyWords) {
        // On split la phrase en mots.
        $wordsOfSentence = multiexplode(array(" ", "'"), $sentence);
        // On initialise les mots clefs (motifs) formant le pattern à chercher dans chaque phrase.
        $tableOfKeyWords = $keyWords;
        $counter = 0;
        // Pour chaque mot de la phrase.
        foreach ($wordsOfSentence as $value1) {
            // Pour chaque mot clef.
            foreach ($tableOfKeyWords as $value2) {
                // Si ces deux mots sont égaux.
                if (preg_match('/' . $value2 . '/i', $value1)) {
                    // On incrémente le compteur.
                    $counter++;
                }
            }
        }
        echo $counter . '<br/>';
    }
    Ici le compteur retourne 3 par exemple, et c'est parfait et logique ^^

    On m'avait bien proposé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (count(array_intersect(explode(' ', $string), $tabKey)) >= 3) {
        // ...
    }
    Mais ça implique que le motif recherché doit être rigoureusement le même que l'un des mot de la chaîne.

    Or je voudrais que mon algo marche aussi sur cette exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sentence = "0678 00 52 44 10 96 85";
    $keyWords = array('06', '96', '12','44');
    Que ici cela repère également le 06 même si dans la chaîne il est sous la forme de 0678.

    J'espère avoir été clair ^^ c'est dur à expliquer
    Merci d'avance !

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 374
    Par défaut
    Bonjour !

    Cela sert à quoi ?... Ce sont des départements ?...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $keyWords = array('06', '96', '12', '44');
    Je pense que si dans la variable '$sentence' les données ne sont pas bien structurées, vous n'allez pas vous en sortir!

    Ou alors, dans un 1er temps il faut la passer dans une "moulinette", qui va la remettre d'équerre. Non ?...

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut
    Non, non ce ne sont pas des départements xD
    Mais mon code marche très bien, c'est juste que deux boucles pour faire ça me semble un peu suspect. C'était pour savoir si quelqu'un n'avait pas une solution à base de preg_match_all ou un truc du genre, qui tient en 2 lignes ^^

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 374
    Par défaut
    Non non !
    - Il faut 2 boucles pour comparer chaque élément de '$sentence' avec ceux du '$keyWords'.
    - C'est d'ailleurs pour cela que '$sentence' doit être propre et pas bancale !

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut
    Justement ! Ma question revient au même que "Est-ce qu'il est vraiment nécessaire de comparer chaque élément de la phrase avec chaque élément du tableau ?". Et je ne pense pas... D'où ma raison de croire qu'il y a une possibilité d'amélioration (d'enlever une boucle).

    Regarde par exemple, ceci, ça ne ferait pas l'affaire ?

    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
    function fonc($sentence, $tableOfKeyWords) {
        $counter = 0;
        // Pour chaque mot clef.
        foreach ($tableOfKeyWords as $value2) {
            // Si ces deux mots sont égaux.
            if (preg_match('/\b' . $value2 . '/i', $sentence)) {
                // On incrémente le compteur.
                $counter++;
     
                if ($counter >= 3) {
                    return true;
                }
            }
        }
        return false;
    }

  6. #6
    Inactif  
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 374
    Par défaut
    Oui !
    - Vous pouvez remplacer la boucle interne par une regex !
    - il demeure néanmoins que '$sentence' doit être propre et pas bancale !

Discussions similaires

  1. Vérification motifs dans chaine : preg_match_all
    Par 0.GeGe.0 dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2014, 12h19
  2. [Batch] Problème de vérification d'une chaîne dans une boucle
    Par slyfennec dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/04/2014, 18h06
  3. Remplacer des motifs dans une chaîne
    Par tonguim dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2009, 18h49
  4. Optimiser les jointures dans des requêtes
    Par klereth dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 23/04/2005, 18h29
  5. [OPTIMISATION] [UNION] Union dans une requete
    Par nico44 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/03/2005, 13h47

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