2009-08-04 10 views
2

J'utilise ce qui suit dans mysql pour obtenir des titres dans le tri de la bibliothèque, p. Le parrain est classé comme parrain. SELECT apnumber, aptitle, IF (aptitle LIKE 'Le%', SUBSTRING (aptitle, 5), SI (aptitle LIKE 'A%', SUBSTRING (aptitle, 3), IF (aptitle LIKE 'An%', SUBSTRING (aptitle, 4), aptitle))) AS titre de tri, etc ...php pour créer des titres de tri de bibliothèque

Quel est le moyen le plus efficace en PHP de changer une chaîne en une version triée par la bibliothèque? C'est perdre "An", "A" ou "The" au début d'un titre. Ai-je raison de supposer que je dois être regarder quelque chose comme:

substr_replace (« La », « », 0)

Répondre

1

Je pense que vous êtes généralement correct, oui. Autant que je sache, il n'y a rien intégré à PHP ou MySQL pour aider avec ce type de tri. Les implémentations de code que j'ai vues ont toutes utilisé un ensemble de règles de remplacement de sous-chaînes pour se débarrasser des préfixes indésirables, comme vous le supposez ci-dessus. En général, preg_replace() est utilisé de sorte que vous pouvez spécifier un match au début de la chaîne seulement:

preg_replace("/^The /",'',$title,1); 

Quelque chose à considérer si vous êtes prêt à renoncer à un peu d'espace disque et la normalisation serait de stocker une deuxième colonne appelée quelque chose comme sort_title, et faire le retrait du préfixe avant d'insérer les enregistrements. Cela vous permettrait d'indexer et de ORDER BY sur le champ sort_title dans MySQL, et de réduire la complexité de vos instructions SELECT.

Comme un autre côté, ce serait une extension grande à écrire pour PHP!

+0

Merci ... En fait, j'ai commencé à utiliser l'instruction mysql ci-dessus pour peupler certaines tables plus anciennes ... maintenant à une fonction pour le faire directement à partir de PHP! – Ian

+0

Est-ce que le motif de recherche dans preg_replace autorise OU'ing || ? Vous vous demandez si cela peut être fait dans une seule ligne preg_repalce ... – Ian

+0

Oui, 'preg_replace' utilise une syntaxe d'expression régulière normale, donc les ORs sont pris en charge via un seul caractère. Vous pouvez faire quelque chose comme 'preg_replace ("/^ (Le | A | An |)/", '', $ title, 1)'. – zombat

Questions connexes