Autor | Zpráva | ||
---|---|---|---|
Michales Profil |
#1 · Zasláno: 16. 5. 2015, 13:24:40
Ahoj už dnes podruhé.
Vypisuji na stránce texty songů. Vypisuji je podle abecedy, kdy je možné si vybrat podle písmena jaké texty se vypíšou. Takže mám klikací abecedu A B C .......Y Z Všechno to funguje v pořádku ale teď bych potřebova radu, jak vypsat songy která nemají na první místě písmeno ale znak, jako například $, ' atd. Pro představu 2 názvy $100, 000 In Pennies '57 Chevrolet Jak zobrazit takovéto skladby? $abeceda = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); for ($i=0; $i<count($abeceda); $i++) { echo '<a href="text_lyrics.php?pismeno='.$i.'"> '.$abeceda[$i].' </a>'; } |
||
Fisir Profil |
#2 · Zasláno: 16. 5. 2015, 13:31:54
Reaguji na Michalese:
Generuj abecedu dynamicky na základě vložených skladeb. Takhle do ní můžeš přidat i čísla a další speciální znaky. |
||
Michales Profil |
Fisir:
Jestli to chápu správně, znamená to vytáhnout všechny skladby s GROUP BY A pak zobrazit jen počáteční písména?
Chápu to správně? |
||
Fisir Profil |
#4 · Zasláno: 16. 5. 2015, 13:34:41
Reaguji na Michales:
V postatě ano. |
||
Michales Profil |
#5 · Zasláno: 16. 5. 2015, 13:38:01
Fisir:
Dobrá, zkusím to. Doufám že to nebude extra náročné na databázi. Bude to muset projíždět deseti tísíce řadků. |
||
Alphard Profil |
Michales:
„Jestli to chápu správně, znamená to vytáhnout všechny skladby s ORDER BY A pak zobrazit jen počáteční písména?“
Ne. Skladeb existuje hodně, nebylo by rozumné vše vytahovat z aplikace jen kvůli tomuto. Pomocí substring a seskupení (nebo distinct) lze vytáhnout z databáze přímo první písmena, ale ani to není nejrychlejší. Přidal bych sloupec s prvním znakem, aby byl dostupný v indexu bez volání funkce. select distinct substring(name, 1, 1) from songs order by 1 |
||
Michales Profil |
#7 · Zasláno: 16. 5. 2015, 13:54:35
Alphard:
Děkuji moc. Ovšem znaky jako $ ' ( .[ { to stejně nevezme, ikdyž tak začínají skladby, tak je to nevypíše. |
||
Luky Profil |
#8 · Zasláno: 16. 5. 2015, 13:56:34
Alphard:
sloupec navíc je určitě dobrý nápad. Ukládat do něj pouze písmenko bez diakritiky a všechny ostatní počáteční znaky označit třeba jako # ($100, 000 In Pennies, '57 Chevrolet...) Na webu pak: $abeceda = range('A', 'Z'); $abeceda[] = '#'; |
||
Michales Profil |
Luky:
Vím že to je dobrý nápad a určitě se k tomu časem dostanu až budu mít více času zhruba 150 tisíc řádku projet a vložit do nového sloupce ty znaky. Teď bych to ovšem potřeboval vyřešit takto, pokud to bude možné. Vyřešil jsem znaky '( ale ty ostatní stejně ne. |
||
Luky Profil |
#10 · Zasláno: 16. 5. 2015, 14:19:51
Michales:
Nečekej, inspiruj se hrubým scriptem a zbav se tohoto problému :) $result = $db->query('SELECT title FROM songs'); foreach($result as $item){ $first = substr($item->title, 1, 1); // zde ještě nějaký iconv("utf-8", "us-ascii//TRANSLIT", $first) pro odstranění diakritiky... if(!ctype_alpha($first)){ $first = '#'; } //UPDATE sloupce } |
||
Michales Profil |
#11 · Zasláno: 16. 5. 2015, 14:22:06
Luky:
Dobře díky. Asi mi nic jiného nezbývá ;-) |
||
Michales Profil |
#12 · Zasláno: 16. 5. 2015, 16:15:33
include 'db.php'; $query2="SELECT `Title` FROM songs"; $result = mysql_query($query2); foreach(mysql_fetch_array($result) as $klic => $hodnoty){ $first = substr($hodnoty['Title'], 1, 1); $first = iconv("utf-8", "us-ascii//TRANSLIT", $first);// zde ještě nějaký iconv("utf-8", "us-ascii//TRANSLIT", $first) pro odstranění diakritiky... if(!ctype_alpha($first)){ $first = '#'; } $query3 = "UPDATE `songs` SET `zkratka`= '".$first."'"; //UPDATE sloupce } Mi hází na řádku: $first = substr($hodnoty['Title'], 1, 1); chybu : Warning: Illegal string offset 'Title' in nevíte prosím proč?
|
||
Alphard Profil |
#13 · Zasláno: 17. 5. 2015, 01:21:43
Jestli jste na to ještě nepřišel sám, takhle výsledky z databáze pomocí
mysql_fetch_array procházet nejde (mysql_fetch_array musí být volán opakovaně, posouvá interní ukazatel aktuálního záznamu), použijte klasický while.
|
||
Michales Profil |
#14 · Zasláno: 17. 5. 2015, 10:06:51
Alphard:
Jo přišel jsem na to. Ovšem script se nikdy neprovede do konce protože vyprší čas spojení. Zatím jsem použil vaše rešení. Tímto se budu zabývat az bude více času. |
||
Alphard Profil |
To se také dalo čekat, pak si implementujte dávkové zpracování (nějaký
limit a postupně zvyšovaný offset ). Nebo lépe, použijte část mého dotazu pro update většiny položek základní abecedy a zbytek pak dořešte na jeden průchod.
Dále se script značně zrychlí, když budete updatevat více záznamů najednou. |
||
Časová prodleva: 10 let
|
0