Trier un tableau à partir d'une valeur calculée

Résolu
mikkro Messages postés 5 Date d'inscription jeudi 13 octobre 2005 Statut Membre Dernière intervention 30 mars 2010 - 29 mars 2010 à 11:26
mikkro Messages postés 5 Date d'inscription jeudi 13 octobre 2005 Statut Membre Dernière intervention 30 mars 2010 - 30 mars 2010 à 11:24
Bonjour tout le monde.
Je developpe actuellement pour mon boulot, une cartothèque.
Tout fonctionne mais il y a quelque chose qui me chagrine, en effet je n'arrive pas à trier les résultats de ma recherche par mots clés par pertinence. Celle-ci etant calculée dans la boucle "for". Je voudrais bien entendu trier dans l'ordre décroissant.

Avec un bout de code je pense que ce sera plus simple pour les ames charitables qui pourraient m'aider
<?php
include "../script/connection.inc";
include "../script/conv_date.inc";

$motscles=$_POST['zl_motscles'];//mots cles selectionnés dans la liste multiple

?>


Résultat de la recherche par mots clés
<?php
if ($motscles){
echo '
Mots clés séléctionnés :
';
$cptMC=0;
foreach ($motscles as $idmotscles){
$motscles_text=mysql_result(mysql_query("select Lib_MotsClesCarte from c_motsclescarte where ID_MotsCles=$idmotscles"),0,0);
echo ' ',$motscles_text,'';
$id_motscles.=";".$idmotscles;
$cptMC++; // compte le nombre de mots clés selectionnés
}
}else{
echo '
Vous n\'avez pas séléctionné de mots clés';
}
?>

<hr />
<?php
$id_motscles_id = substr($id_motscles,1);//suppression du premier caractère, ici un ;
$motscles_id = str_replace ( ';', ' or MotsClesCarte_ID_MotsCles=', $id_motscles_id);

/****************Récupération des variables********************/
$sql="select Carte_ID_Carte".
" from c_cartemotsclescarte".
" where MotsClesCarte_ID_MotsCles=$motscles_id".
" order by Carte_ID_Carte";
$rs=mysql_query($sql);

while($lg=mysql_fetch_assoc($rs)){
$id_carte=$lg["Carte_ID_Carte"];
$id_carte_id.=";".$id_carte;
}

$id_carte_id = substr($id_carte_id,1);//suppression du premier caractère, ici un ;
$id_carte_id=explode(";",$id_carte_id);
$tot=count($id_carte_id);
$cpt=0;
for($i = 0; $i < $tot; $i++){
$j=$i+1;
$cpt++;// compte le nombre de fois où la carte apparait

if($id_carte_id[$i]==$id_carte_id[$j]){ //si la carte $i est egale à la carte $j on passe au suivant

}else{	
$pertinence=($cpt/$cptMC)*100;
$pertinence=number_format($pertinence, 0, ',', '');// pertinence calculée

$cpt=0;// nombre de fois où la carte apparait remis à zero pour calcul de la carte suivante
$carte_id=$id_carte_id[$i];	
$sql1=mysql_query("select * from c_carte where ID_Carte=$carte_id");

while($lg1=mysql_fetch_assoc($sql1)) // parcours chaque ligne du tableau résultant de la requête
{			
//Récupération des variables
//...
}

//affichage des données
//...
}
}
?>



What else{}

3 réponses

JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
29 mars 2010 à 23:59
Rapidement, voici comment je ferais (peut être pas exactement ce que tu cherches, j'ai parcouru ton code en croix):

- enregistrement de chaque resultat avec sa pertinance dans un array
- enregistrement de tous ces resultats dans un array, qu on trie avec usort
- une petit fonction de comparaison avec la pertinance comme critère.

La page de manuel de usort est un bon point de départ ;-)

Perso c'est comme ça que je fais pour trier des objets un peu compliqués.

Si tu veux plus de détails, hésites pas à demander, je te code volontier un exemple quand j'ai 5 minutes
3
mikkro Messages postés 5 Date d'inscription jeudi 13 octobre 2005 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 11:24
J'ai finalement réussi, donc je me dis que ca pourra servir alors voici mon code
@JulSoft Merci de ta reponse ca m'a bien remis sur la voie

J'ai en fait créé deux tableaux ayant les mêmes index
$tab_carte et $tab_pertin

ensuite je trie $tab_pertin avec arsort()

et enfin je me sert des index de $tab_pertin pour retrouver ceux de $tab_carte

j'espère que ca en aidera certains



<?php
include "../script/connection.inc";
include "../script/conv_date.inc";

$motscles=$_POST['zl_motscles'];//mots cles selectionnés dans la liste multiple

?>


Résultat de la recherche par mots clés
<?php
if ($motscles){
echo '
Mots clés séléctionnés :
';
$cptMC=0;
foreach ($motscles as $idmotscles){
$motscles_text=mysql_result(mysql_query("select Lib_MotsClesCarte from c_motsclescarte where ID_MotsCles=$idmotscles"),0,0);
echo ' ',$motscles_text,'';
$id_motscles.=";".$idmotscles;
$cptMC++; // compte le nombre de mots clés selectionnés
}
}else{
echo '
Vous n\'avez pas séléctionné de mots clés';
}
?>

<hr />
<?php
$id_motscles_id = substr($id_motscles,1);//suppression du premier caractère, ici un ;
$motscles_id = str_replace ( ';', ' or MotsClesCarte_ID_MotsCles=', $id_motscles_id);

/****************Récupération des variables********************/
$sql="select Carte_ID_Carte".
" from c_cartemotsclescarte".
" where MotsClesCarte_ID_MotsCles=$motscles_id".
" order by Carte_ID_Carte";
$rs=mysql_query($sql);

while($lg=mysql_fetch_assoc($rs)){
$id_carte=$lg["Carte_ID_Carte"];
$id_carte_id.=";".$id_carte;
}

$id_carte_id = substr($id_carte_id,1);//suppression du premier caractère, ici un ;
$id_carte_id=explode(";",$id_carte_id);
$tot=count($id_carte_id);
$cpt=0;
for($i = 0; $i < $tot; $i++){
$j=$i+1;
$cpt++;// compte le nombre de fois où la carte apparait

if($id_carte_id[$i]==$id_carte_id[$j]){//si la carte $i est egale à la carte $j on passe au suivant

}else{	
$pertinence=($cpt/$cptMC)*100;
$pertinence=number_format($pertinence, 0, ',', '');// pertinence calculée


$tab_cart.=",".$id_carte_id[$i];//concatenation des identifiants de cartes
$tab_pert.=",".$pertinence;//concatenation des valeurs de pertinence

$cpt=0;// nombre de fois où la carte apparait remis à zero pour calcul de la carte suivante	
}
}

$tab_cart = substr($tab_cart,1);//suppression du premier caractère, ici un ;
$tab_cart = explode(",",$tab_cart);//creation du tableau de carte

$tab_pert = substr($tab_pert,1);//suppression du premier caractère, ici un ;
$tab_pert = explode(",",$tab_pert);//creation du tableau de pertinence (les index sont identiques à ceux du tableau de carte)

arsort($tab_pert);//tri decroissant du tableau de pertinence
foreach ($tab_pert as $id => $pertin) {


$carte_id=$tab_cart[$id];//utilisation de l'index de $tab_pertin pour retrouver celui de $tab_carte	
$sql1=mysql_query("select * from c_carte where ID_Carte=$carte_id");

while($lg1=mysql_fetch_assoc($sql1)) // parcours chaque ligne du tableau résultant de la requête
{			
//Récupération des variables


}

//affichage des données
   
}

?>




What else{}
3
mikkro Messages postés 5 Date d'inscription jeudi 13 octobre 2005 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 09:08
Merci pour la réponse rapide.
En fait j'avais deja penser à faire cela mais j'ai du mal m'y prendre parce que j'ai laissé tomber.
Le problème est que je n'arrive pas à creer un array supplémentaire.

Pour faire simple voilà ce que je voudrais faire

j'ai un premier tableau, jusque là rien de bien compliqué

id_carte=array(1,1,1,1,2,2,2,2,2,2,3,3,3,4,4);

j'obtient par mon calcul le système suivant mais qui n'est pas un array

id_carte / 1 / 2 / 3 / 4
------------------------------
pertinence / 4 / 6 / 3 / 2 (pour faire simple je ne calcule pas ici les pourcentages)

Ce que j'aimerais donc c'est de classer mes cartes dans l'ordre décroissant de pertinence alors qu'actuellement elles sont
classées dans l'ordre de leurs identifiants.

Si tu peux donc me montrer simplement comment je peux faire ce serait vraiment sympa de ta part.

Merci d'avance

What else{}
0
Rejoignez-nous