problemet med både min løsning og #1's løsning er at hvis der står + eller - og så et tal, så vil denne også betragtes som et tal, selvom det føste bogstav jo enten er et plus eller et minus.
dvs. at +10titel og -5titel også vil anses som at titlen egentligt ikke starter med et tal.
#5, Dit match vil også fange "tit5le". Desuden mangler du stråstreger i starten og i slutningen af din pattern. Det giver heller ingen mening at karaktergruppere et \d når ikke du vil tillade andre tegn eller foruddefinerede grupper. Hvis du virkeligt vil se om en tekst starter med et tal - og om der eventuelt står "+" eller "-" foran, skal du nok ud i noget i retningen af
preg_match('/^[+-]?\d/', $str);
Synes godt om
Slettet bruger
07. februar 2009 - 21:16#10
Det er tæt på, men spiller ikke helt, kan I gennemskue det? Problemet er, at den nu sætter flg. ind:
# 10.000 BC 1408
# 2 Fast 2 Furious
# 3:10 to Yuma
A A Beautiful Mind A Good Year
B Babel Borat
osv...
Filmene hvor første karakter er et ciffer skal jo være samlet under ét ala:
# 10.000 BC 1408 2 Fast 2 Furious 3:10 to Yuma
A A Beautiful Mind A Good Year
B Babel Borat
osv...
Min kode:
$Titel = $row['Titel'];
if ($Titel[0] != $checkChar) { $checkChar = $Titel[0];
Jeg syntes du bruger meget plads på at beskrive noget meget simpelt. Prøv at lege lidt med følgende script: <?php function sort_categories($array){ $categories = array("#" => "1|2|3|4|5|6|7|8|9|0", "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","æ","ø","å"); foreach($array as $movie){ $movie_first_char = strtolower($movie[0]); foreach($categories as $key => $category){ if(preg_match("[$category]",$movie_first_char)){ if(strlen($category) > 1){ $sorted_array[$key][] = $movie; } else{ $sorted_array[$category][] = $movie; } } } } return $sorted_array; }
$movies = array("1:10 To Yuma", "Anger Managament", "I Know What You Did Last Summer"); $movies_sorted = sort_categories($movies); foreach($movies_sorted as $category => $movies){ echo "<strong>" . strtoupper($category) . "</strong>:<br/>"; foreach($movies as $movie){ echo $movie . "<br/>"; } } ?>
Hvis du henter film fra en database kan du blot indsætte dem i det array der hedder $movies[] og derefter kalde "sort_categories($movies);" Har testet scriptet og det virker for mig. Du skal dog være opmærksom på at i ældre versioner af PHP virker strtolower og strtoupper ikke på Æ, Ø og Å...
Det ville for øvrigt være rigtigt snedigt at bruge: asort($movies); inden du kalder: $movies_sorted = sort_categories($movies); da det vil sørge for at rækkefølgen er ens hver gang:)
Lige en note: ikke fordi det gør meget forskel i dette tilfælde, men du kan sagtens bruge "sort" i stedet for "asort", da der ikke er noget krav om at key's og value's skal bibeholdes samlet.
Hvis du henter direkte ud af MySQL skal du nok have en:
... ORDER BY titel
*og* hele databasen/din tabel/titel kolonnen skal have kollation latin1_danish_ci eller utf8_danish_ci (afhængigt af om du bruger ISO-8859-1 eller UTF-8 i databasen) !
Synes godt om
Slettet bruger
08. februar 2009 - 21:28#20
Hej Arne, dit forslag fungerer fint, men er der ikke en nem måde at smide "setlocale" ind i min mysql-loop ovenfor? Den kode fatter jeg nemlig :-) Det er sjovt nok kun "å" den ikke vil acceptere - film med "æ" og "ø" ryger fint nok ud sidst i rækken...
Det er i øvrigt sat til utf8_danish_ci i databasen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.