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

PHP & Base de données Discussion :

trier des array selon le nombre de mots communs


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut trier des array selon le nombre de mots communs
    en gros, j'ai un array qui contient des array qui contiennent chacun une case qui se nomme 'message' , et j'ai un autre array qui contient des tags, et jdois trier les premiers array par nombre de tags présent dans la case 'message' correspondante

    pour ceux qui n'ont pas compris, voila ce que me donne un var_dump du premier array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    array
      0 => 
        array
          'id' => string '50' (length=2)
          'message' => string 'mon message' (length=11)
      1 => 
        array
          'id' => string '53' (length=2)
          'message' => string 'un autre message' (length=16)
    ainsi de suite pour plusieurs résultats .... et je voudrais qu'ils soient trié selon le nombre de "tags" présent dans chaque case message ... pour cela, j'ai un array qui contient mes tags .



    j'ai essayer quelque chose comme cela pour commencer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      foreach($simil as $topic_similars){
           $I = 0;
          foreach($cur_topic_tags as $tag){
              if(preg_match('#'.$tag.'#', $topic_similars['message']))
                      $I++;
           }
           $similitudes[] = $simil;
           $similitudes['similitudes'] = $I;
      }
    avec $simil le array ci dessus, et $cur_topic_tags c'est mon array avec les tags ... le problème, c'est que ce code dépasse les 30 secondes .... ( $simil contient plus d'une centaine de array )

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    1. J'éclaterais message avec str_word_count( )
    2. Je compterais les mots/tags communs avec array_intersect( ) + count( )
    3. Je ferais le tri avec usort( )

    On peut personnaliser l'intersection (sensibilité casse/accents) avec array_uintersect( )

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    cela ne risque t'il pas de consommer énormément de ressources ?

    ça ferait quand même beaucoup de mots au final .... ( surtout que c'est encore un petit site, et que cela consommera donc de plus en plus puisque le nombre d'articles augmentera )

  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,

    la piste de Séb. ne tient la route que pour un volume raisonnable de données (30 secondes de traitement c'est déjà énorme).
    Il faut t'orienter, je pense, vers autre chose comme par exemple les recherche en FULL-TEXT sur MySQL (qui sont déjà pas mal optimisées). Après tu n'échapperas pas au problème de l'adéquation des ressources techniques en fonction des besoins. Donc à un moment, il faudra augmenter la voilure pour continuer à maintenir/fournir un niveau de service acceptable.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    hum, si j'ai bien compris, il me suffit de faire ma requete avec match(), un fetc_assoc, et mon array sera automatiquement ordonné ?

  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
    Salut,

    il faut bien potasser le lien que je t'ai mis dans mon précédent message.
    Fais gaffe, ne connaissant pas ta version de MySQL, je t'ai filé un lien portant sur MySQL 5.0
    Vérifies la doc en fonction de ta version de MySQL. Depuis la 5.0, il y a eu des améliorations.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par thib3113 Voir le message
    hum, si j'ai bien compris, il me suffit de faire ma requete avec match(), un fetc_assoc, et mon array sera automatiquement ordonné ?
    Oui à condition de faire la bonne requête :

    L'exemple suivant est plus complexe. La requête retourne la valeur de pertinence et organise les lignes par ordre décroissant de pertinence. Pour obtenir ce résultat, il faut spécifier MATCH() deux fois. Cela ne cause pas de surcharge car l'optimiseur de MySQL remarquera que les deux appels à MATCH() sont identiques et appellent le code de recherche sur texte intégral une seule fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mysql> SELECT id, body, MATCH (title,body) AGAINST
        -> ('Security implications of running MySQL as root') AS score
        -> FROM articles WHERE MATCH (title,body) AGAINST
        -> ('Security implications of running MySQL as root');
    http://dev.mysql.com/doc/refman/5.0/...xt-search.html

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Version MySQL 5.1.62-cll donc pas de problème


    Séb. : hum .... en gros que doit contenir le against ???

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par thib3113 Voir le message
    Séb. : hum .... en gros que doit contenir le against ???
    Les tags.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    un tag par against ???

    et dans ce cas quel doit etre le deuxième paramètre pour match ?

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    un tag par against ???
    Non tous.

    Soyons fous, laissons FULLTEXT se débrouiller et voyons si le résultat convient.

    et dans ce cas quel doit etre le deuxième paramètre pour match ?
    MATCH( ) a autant de paramètres que de champs à examiner.

    http://dev.mysql.com/doc/refman/5.0/...xt-search.html

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    merci, j'ai réussi à faire ce que je voulais

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/03/2015, 16h32
  2. trier un array selon le nombre d'occurence
    Par thib3113 dans le forum Langage
    Réponses: 1
    Dernier message: 22/05/2012, 01h57
  3. [XL-2007] Trier des onglets selon mois
    Par apt dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/03/2012, 00h33
  4. Réponses: 10
    Dernier message: 01/08/2009, 02h02
  5. [MySQL] Trier des données selon l'entête de colonne
    Par Bibbe dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/11/2007, 01h17

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