Classer par ordre alphabétique sans prendre en compte les x premières lettres

Eléphant du PHP | 160 Messages

18 nov. 2007, 03:15

Bonjour,

Je dois classer par ordre alphabétique des noms mais certains commencent par le ou la ou l', par exemple : Le castor doit apparaître à la lettre C malgré le Le.
Comment faire pour classer par ordre alphabétique malgré cela ? Si quelqu'un peut m'aider, je ne vois pas trop comment faire...
		<?php
		$i = 0;
		$req_client ="SELECT clients_id,label FROM ld_clients ORDER BY clients_id DESC";
		$req_client = mysql_query($req_client) or die("Echec de la requête<br/>".mysql_error());
		
		while($data_client = mysql_fetch_array($req_client)) 
		{
			$label_c  	= $data_client['label'];
			$id_c		= $data_client['clients_id'];
			$url_c 		= rewriteURL($label_c)."-client-".$id_c.".html";
		?>
			<li><a href="<?php echo $url_c?>"><?php echo $label_c?></a></li>

        <?php
			$i++;
		}
		?>
Merci

Mammouth du PHP | 881 Messages

18 nov. 2007, 04:17

D'entrée, je miserais sur une adaptation de la formule de Truc:
http://www.phpfrance.com/forums/viewtop ... b6e60acf71
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 nov. 2007, 11:15

Bonjour,

Ce que tu cherches à faire doit être possible avec une grosse requête SQL, toutefois, je te conseillerai plutôt de rajouter un champ "nom_classement_alpha" dans lequel tu stockerai le nom de tes clients sans la particule le | la | l'

Car si à chaque fois que tu veux afficher la liste de tes clients tu es obligé de faire une requête SQL qui va demander pas mal de calcul à MySQL, tu va gaspiller des ressources pour rien (et ralentir l'affichage de tes pages par la même occasion)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 185 Messages

18 nov. 2007, 11:35

Une autre solution serait peut-être de récupérer les enregistrements dans la base de données, les "couper" à l'aide de la fonction explode, les insérer dans un tableau, puis trier ce tableau en toute fin...

J'ai écrit ce code sans l'avoir testé... A voir :
<?php

// Ici j'enlève la clause ORDER BY. On effectuera le tri plus loin...
$req_client ="SELECT clients_id, label FROM ld_clients";
$req_client = mysql_query($req_client) or die("Echec de la requête<br/>".mysql_error());

// On crée un tableau contenant les particules des noms
$particules = array('Le ', 'La ', 'L\'', 'De ', 'De la ', 'De l\'', 'Du ');

// On initialise $label_c
$label_c = array();

while ($data_client = mysql_fetch_assoc($req_client)) {
	// On scinde les particules et les noms en deux entitées 
	$cut = explode($particules, $data_client['label']);
	// On replace la particule à la fin du nom entre parenthèses
	$label_c[] = $cut[1].' ('.$cut[0].')';
}

// On effectue le tri une fois les chaînes traitées
rsort($label_c);

?>

Eléphant du PHP | 160 Messages

18 nov. 2007, 19:14

J'ai essayé en vain les deux solutions proposées,
Je ne vois pas où générer ma liste dans le code proposé car le dernier tri est sorti de la boucle... je ne comprends pas.
J'ai essayé aussi le code de truc mais je ne vois pas comment l'adapter.
Si quelqu'un peut m'aider encore un peu...
Au pire il me restera la solution (fastidieuse mais sûre) qui consistait à laisser ajouter un champ pour l'article (le, la, l'...) mais si je peux éviter, c'est que j'ai beaucoup de valeurs déjà enregistrées...

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 nov. 2007, 22:03

Ma solution pourrai se faire en coupant à l'espace apres "le" et "la" mais marche plus pour "l'" o|u il faudrait l'apostrophe.
Je pense que les performances ne seraient pas au top en effectuant le tri sur ce deux cas.

La proposition d'@rthur semble meilleure pour ton cas.
Tu peux te faire un script pour le faire de manière automatique pour les valeurs déjà enregistrée et adapter 2 lignes de code sur ton script actuel pour couper suivant l'espace ou l'apostrophe pour enregistrer dans deux champs.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

19 nov. 2007, 11:22

Merci pour votre aide, je vais faire comme cela.

Merci encore