Besoin d'aide, php, tableau, tri...

Répondre
Partager Rechercher
Bonjour ici !

Je cherche à trier mon dictionnaire, pour trouver facilement les verbes, noms, adjectifs... Je ne sais pas si c'est une bonne solution, mais je pensais ajouter simplement trois colonnes. Cependant, je n'y arrive pas...

Si je fais ça, j'ai une erreur :
"swelo" => "aimer", => "verbe",

Si je fais ça aussi :
"swelo" => "aimer","verbe",

J'ai cherché sur plusieurs sites, mais comme je suis un idiot, je n'arrive pas saisir comment ça marche. J'ai passé l'après midi dessus... Merci pour votre précieuse aide.

Voilà ma page de test :
Code:
http://carnets-virtuels.org/dolorhant/doa/dicobeta2010.php
et un bout de code de la même page :


Code:
<body class="body">
<p class="haut_de_page">Note : pour trouver un mot en particulier, utilisez la fonction "rechercher" de votre navigateur. Ctrl+F dans Firefox.</p>

<?php
/*
Template Name: Dictionnaire
*/
?>

<?php
$dictionnaire = array(
"a" => "a",
"b" => "b",
"c" => "c",
"swelo" => "aimer",
"fu'orh"   =>  "feu",
"graki" => "grand",);

if($_POST["trier"]=="francais")
     asort($dictionnaire);
elseif($_POST["trier"]=="doa")
     ksort($dictionnaire);
else //par défault
     ksort($dictionnaire);
?>

     <center><table class="table">
     <thead>
          <tr>
               <th><form method="post"><input type="hidden" name="trier" value="doa" /><input type="submit" value="Dictionnaire DOA" /></form></th>
               <th><form method="post"><input type="hidden" name="trier" value="francais" /><input type="submit" value="Dictionnaire francais" /></form></th>
               <th><form method="post"><input type="hidden" name="trier" value="verbes" /><input type="submit" value="Verbes" /></form></th>
               <th><form method="post"><input type="hidden" name="trier" value="adjectifs" /><input type="submit" value="Adjectifs" /></form></th>
               <th><form method="post"><input type="hidden" name="trier" value="noms" /><input type="submit" value="Noms" /></form></th>				
          </tr>
     </thead>
     <tbody>
     <?php
     foreach($dictionnaire as $doa=>$francais)
          echo '<tr><td>'.$doa.'</td><td>'.$francais.'</td><td>'.$verbes.'</td><td>'.$adjectifs.'</td><td>'.$noms.'</td></tr>';
     ?>
	 </tbody>
     </table></center>
     </body>
</html>
Fais en 10 minutes:

Code:
<?

class Mot {
	var $type; // verbe, adjectif, noms, etc...
	var $francais; // le mot en fr
	var $doa; // le mot en doa
	
	function __construct( $t, $f, $d ) {
		$this->type = $t;
		$this->francais = $f;
		$this->doa = $d;
	}
};

function cmpByFr( $motA, $motB ) {
	if( $motA->francais > $motB->francais )
		return 1;
	else if( $motA->francais < $motB->francais )
		return -1;
		
	return 0;
}

function cmpByDoa( $motA, $motB ) {
	if( $motA->doa > $motB->doa )
		return 1;
	else if( $motA->doa < $motB->doa )
		return -1;
		
	return 0;
}

function cmpByType( $motA, $motB ) {
	if( $motA->type > $motB->type )
		return 1;
	else if( $motA->type < $motB->type )
		return -1;
		
	return 0;
}

function typeSelector( $mot, $type ) {
	if( $mot->type == $type )
		return true;
		
	return false;
}

$dico = array( 
	new Mot( "verbe", "aimer", "swelo" ), 
	new Mot( "nom", "feu", "fu'orh" ),
	new Mot( "adjectif", "grand", "graki" ),
	new Mot( "verbe", "aimer", "swelo" ), 
	new Mot( "nom", "feu", "fu'orh" ),
	new Mot( "adjectif", "grand", "graki" )
);

print_r( $dico ); ?><br /><br /><?
usort( $dico, "cmpByFr" ); print_r( $dico ); ?><br /><br /><?
usort( $dico, "cmpByDoa" ); print_r( $dico ); ?><br /><br /><?
usort( $dico, "cmpByType" ); print_r( $dico ); ?><br /><br /><?

// sélectionner les verbes

foreach( $dico as $mot ) {
	if( typeSelector( $mot, "verbe" ) ) {
		print_r( $mot );
	}
}

?>
En fait, je viens de me rendre compte qu'on peut avoir exactement la même chose en virant la classe Mot et en utilisant juste un multi-array à la place... Bref le principe est exactement pareil

Bon, tu perds le caractère accès "rapide" via la clé, mais tu peux facilement créer un foncteur de recherche à compexité logarithmique. C'est un peu le prix à payer si tu veux pouvoir trier dans les 2 sens sans perdre le type du mot, à moins de dupliquer le type dans les 2 côtés, ce qui fait que tu auras un tableau avec une paire( mot, type ) de chaque côté. Mais dupliquer une même information est toujours à proscrire en programmation.
Il y a aussi la version à multi array, puis tu utilises array_multisort pour trier selon la colonne que tu veux.

$mots = array();
$mots["verbes"] = array();
$mots["verbes"]["bli"] = "bla";

etc...
Merci pour votre aide.

Pour autant, je n'y arrive pas, snif... Ca fait deux ans que je n'ai pas touché à tout ça, et j'ai perdu le peu que j'avais appris. Là, je comprends vaguement certaines choses mais dans l'ensemble, c'est du japonais, et encore, je pense avoir plus de notions en japonais. J'ai galéré pour me remettre a peu près dans le bain du html+css, mais le php me semble tellement loin...

C'est déprimant de voir à quel point on peut oublier quelque chose...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés