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 :

[Tableaux] Fusion de tableaux associatifs


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut [Tableaux] Fusion de tableaux associatifs
    Bonjour,

    Ça doit être simple, mais je ne trouve pas.
    J'ai créé trois tableaux
    Les deux premiers sont déterminés par une recherche dans un table mysql
    $titre[$id]
    $soustitre[$id]
    Le troisième calcule un score pour chaque ligne de la table
    $compteur[$id]
    J'ai trié les valeurs de $compteur par ordre décroissant et j'ai supprimé les lignes dont la valeur est égale à 0 (donc j'ignore complètement quelles sont les valeurs successives de $id)

    je voudrais afficher les résultats de la recherche
    J'ai tenté ça : pour chaque ligne de $compteur, j'affiche le titre et le sous titre correspondant à la clé $id...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach( $compteur as $id => $value) 
    echo "Résultat n°X age $id dont le titre est $titre[$id] et le sous-titre est $soustitre[$id].<br>";
    Je me dis qu'il faudrait faire un seul tableau avec pour chaque ligne
    id score titre sous-titre
    Mais je n'y arrive pas.

    J'espère que je suis clair (?)

    À votre disposition pour de plus amples explications.

    En vous remerciant de votre attention

  2. #2
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Tu peux faire cela directement en mysql avec des jonctions.

    Comment sont tes requêtes de tables qui constituent tes tableaux.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Houlà, ça c'est compliqué !
    Je vais quand même essayer d'expliquer

    Il s'agit d'un moteur de recherche
    Il recherche des mots-clé, d'abord dans le champ "titre" (comme dans le code ci-dessous), puis dans un champ "description" puis dans un champ "contenu"
    Le tableau $compteur récapitule le score obtenue par chaque page que je distingue par son "id"

    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
    $recherche = mysql_query("SELECT id, classe, titre, soustitre, MATCH (titre) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error()); // la requête, que maintenant vous devez comprendre ;)
    while($donnees = mysql_fetch_array($recherche))
    {
    $id=$donnees['id'];
    $total=$compteur[$id];
    $classe=$donnees['classe'];
    $matchscore=$donnees['score'];
    if ($matchscore !=0)
    {
    // echo "résultat des recherches dans le titre<br>";
    $compteur[$id]=$total+$matchscore*($score+2)+$classe ;
    $titre[$id] = $donnees['titre'];
    $soustitre[$id] = $donnees['soustitre'];
    }
    }
    Voilà ensuite, le moteur cherche dans le champ description, puis dans le champ contenu. Je tiens à ces recherches successives parce que je n'attribue pas le même score à la recherche selon que l'expression a été trouvée dans le titre, dans la description ou dans le contenu.

    La partie recherche du moteur fonctionne correctement (même si elle peut assurément être améliorée).
    Voir mon moteur ici
    Ce qui me pose problème, c'est l'affichage des résultats.
    Dans la page proposée ci-dessus, j'y arrive en faisant une nouvelle requête vers la table, spécifique pour l'affichage à partir des id contenues dans le tableau $compteur. Je me dis que je pourrai économiser cette requête...

    Merci de me dire si c'est possible...

  4. #4
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Si j'ai bien compris (pas sûr) tu as 3 requêtes successives pour

    Le titre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche1 = mysql_query("SELECT id, classe, titre, soustitre, MATCH (titre) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    La description

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche2 = mysql_query("SELECT id, classe, titre, soustitre, MATCH (description) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    Le contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche3 = mysql_query("SELECT id, classe, titre, soustitre, MATCH (contenu) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    Et tu veux un tableau qui récupère tout. Dans ce cas tu fais un array_merge de chaque résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche = array_merge($recherche1, $recherche2, $recherche3)
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Oui, tu as compris...
    Mais, je me demande néanmoins si ta réponse me convient parce que je souhaite donner un score différencié à la page selon que l'expression ou les mots clés sont trouvés dans le titre, la description ou le contenu.

    cf l'extrait de mon code. Pour la recherche 1 j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($matchscore !=0)
    {
    $compteur[$id]=$total+$matchscore*($score+2)+$classe ;
    NB $total est le score déjà acquis par la page trouvée, $matchscore est le résultat obtenu par la recherche booléenne, $classe est une valeur qui figure dans la table et qui correspond, pour chaque page, à sa place dans le plan, $score est différent selon qu'on recherche des mots clés ou une expression complète...

    Pour la recherche 2, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($matchscore !=0)
    {
    $compteur[$id]=$total+$matchscore*($score+1)+$classe ;
    Et pour la recherche 3, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($matchscore !=0)
    {
    $compteur[$id]=$total+$matchscore*($score)+$classe ;
    Est-ce que ce que tu me proposes ne revient pas au même que si je faisais une seule recherche à la fois dans les champs "titre", "description" et "contenu" ? Et si non, comment je fais pour récupérer mon score ?

    En te remerciant de ton aide,

    Bien cordialement,

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Tu as besoin de savoir dans le tableau $recherche l'origine de la reqûete.
    Donc rajoute dans le select un marqueur que j'ai appelé "tri" et tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche1 = mysql_query("SELECT '1' AS 'tri', id, classe, titre, soustitre, MATCH (titre) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    Puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche2 = mysql_query("SELECT '2' AS 'tri', id, classe, titre, soustitre, MATCH (description) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    Et enfin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche3 = mysql_query("SELECT '3' AS 'tri', id, classe, titre, soustitre, MATCH (contenu) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error());
    Tu merges le tout et le code tri qui prend la valeur 1, 2 ou 3 te désigne l'origine de la requête
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    wouahououou
    OK, j'ai compris !
    J'essaie ça demain et j'en reparle si ça va pas.
    Ou, si tout va bien, je mettrai résolu
    Merci de ton aide
    C'est super !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    Et bien ça n'a pas marché, il y avait une erreur comme quoi, il ne connaissait pas mes tableaux !
    Mais peu importe, finalement, j'ai fait autrement, cf. ci-dessous :

    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
    $recherchecontenu = mysql_query("SELECT id, classe, titre, soustitre, MATCH (contenu) AGAINST ('$req' IN BOOLEAN MODE)  AS  score FROM pages") or die (mysql_error()); // la requête, que maintenant vous devez comprendre ;)
    while($donnees = mysql_fetch_array($recherchecontenu))
    {
    $id=$donnees['id'];
    $total=$tab[$id]['compteur'];
    $classe=$donnees['classe'];
    $matchscore=$donnees['score'];
    if ($matchscore !=0)
    {
    // echo "résultat des recherches dans le titre<br>";
    $compteur=$total+$matchscore*($score)+$classe ;
    //$scorereel=$compteur[$id];
    $titre = $donnees['titre'];
    $soustitre = $donnees['soustitre'];
    // Créer un tableau multidimensionnel
    $tab[$id]['titre'] = $titre;
    $tab[$id]['soustitre'] = $soustitre;
    $tab[$id]['compteur'] = $compteur;
    Merci pour ton aide,

    bien cordialement

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

Discussions similaires

  1. [Tableaux] Fusion de tableaux et array_merge
    Par wikipierre dans le forum Langage
    Réponses: 3
    Dernier message: 25/01/2008, 08h10
  2. [Tableaux] fusion et tri tableau associatif
    Par Florent08800 dans le forum Langage
    Réponses: 3
    Dernier message: 16/10/2006, 16h23
  3. [Tableaux] connaitre clé tableau associatif
    Par onet dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2006, 09h14
  4. [Tableaux] trier un tableau associatif
    Par cijez dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 16h07
  5. [Tableaux] Fusion & Tri Sans Doublons
    Par pouillou dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2006, 11h03

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