Skrevet lør. d. 07. februar 2009 kl. 15:49:48| #1
Skrevet lør. d. 07. februar 2009 kl. 15:51:11| #2
Dette bestmmer om titlen starter med et heltal:
<?php
$string = "FILM_TITEL";
if((int) $string){
// $string starter med et heltal.
}
?>
Skrevet lør. d. 07. februar 2009 kl. 15:53:39| #3
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.
Skrevet lør. d. 07. februar 2009 kl. 15:57:12| #4
Denne løsning afhjælper dette problem:)
<?php
$string = "FILM_TITEL";
if(preg_match("[1|2|3|4|5|6|7|8|9|0]",$string[0])){
// titel starter med et tal.
}
?>
Skrevet lør. d. 07. februar 2009 kl. 16:01:25| #5
Hvis du vil holde det endnu mere simpelt kan du bruge følgende istedet:
preg_match("[\d]",$string[0])
"[\d]" tjekker efter om inputtet er nummerisk.
Skrevet lør. d. 07. februar 2009 kl. 16:23:54| #6
Hvorfor ikke bare
if(is_numeric(substr($title, 0, 1))) {
#Først char er et ciffer
}
Skrevet lør. d. 07. februar 2009 kl. 16:25:20| #7
is_numeric( $title[0] )
:)
Skrevet lør. d. 07. februar 2009 kl. 17:02:42| #8
Nej. +10titel og -5titel vil ikke blive opfattet som tal.
Ganske vist er "+10" og "-5" tal, men det er "+" og "-" ikke.
Skrevet lør. d. 07. februar 2009 kl. 17:07:21| #9
#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);
Skrevet lør. d. 07. februar 2009 kl. 21:16:40| #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];
if(preg_match("[1|2|3|4|5|6|7|8|9|0]",$Titel[0]))
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/other.gif' width=12 height=12></td></tr>";
}
elseif ($checkChar == "Æ")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/ae.gif' width=12 height=12></td></tr>";
}
elseif ($checkChar == "Ø")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/oe.gif' width=12 height=12></td></tr>";
}
elseif ($checkChar == "Å")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/aa.gif' width=12 height=12></td></tr>";
}
else
{
echo "<tr bgcolor='#E8EEF7'><td colspan=7><img src='gfx_bogstaver/".$checkChar.".gif' width=12 height=12></td></tr>";
}
}
Skrevet lør. d. 07. februar 2009 kl. 22:01:55| #11
Det er godt nok ikke super pæn kode. Lidt indrykning ville eksempelvis hjælpe godt på overskueligheden.
Jeg ved ikke lige hvad variablen $checkChar er som udgangspunkt, men udvid eventuelt første if-sætning til:
if(preg_match('/^[+-]?\d/', $Titel[0])) {
if (!numeric($checkChar))
echo '<tr><td colspan=7><img src="gfx_bogstaver/other.gif" width="12" height="12"></td></tr>';
}
Desuden undre det mig lidt, at du bruger det regulære udtryk du gør, efter forklaringen i kommentar #9.
Skrevet lør. d. 07. februar 2009 kl. 22:02:58| #12
.. og så hedder funktionen selvfølgelig is_numeric. Altså:
if (!is_numeric($checkChar))
...
Skrevet lør. d. 07. februar 2009 kl. 22:28:31| #13
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 Å...
Skrevet lør. d. 07. februar 2009 kl. 22:35:06| #14
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:)
Skrevet lør. d. 07. februar 2009 kl. 23:07:59| #15
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.
Skrevet søn. d. 08. februar 2009 kl. 02:27:19| #16
Der er hverken brug for en special sort eller regex.
is_numeric og en if sætning er nok.
Eksempel:
<?php
function special_print($vals) {
sort($vals);
$prevfirst = '';
foreach($vals as $val) {
$first = $val[0];
if(is_numeric($first)) $first = '#';
if($first != $prevfirst) {
echo $first . "<br>\r\n";
$prevfirst = $first;
}
print $val . "<br>\r\n";
}
}
$vals = array("A Good Year", "2 Fast 2 Furious", "Borat", "3:10 to Yuma", "A Beautiful Mind", "1408", "Babel", "10.000 BC");
special_print($vals);
?>
Skrevet søn. d. 08. februar 2009 kl. 09:43:51| #17
Tusind tak for hjælpen. Jeg er ny til php, så min kode er garanteret hverken optimal eller ny :-)
Jeg er nået frem til flg.:
<?php
$prevfirst = "";
while($row = mysql_fetch_assoc($query)) //Lav en while der kører alle rækker igennem
{
$Titel = $row['Titel'];
$first = $Titel[0];
if(is_numeric($first)) $first = 'other';
if($first != $prevfirst)
{
if ($first == "Æ")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/ae.gif' width=12 height=12></td></tr>";
}
elseif ($first == "Ø")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/oe.gif' width=12 height=12></td></tr>";
}
elseif ($first == "Å")
{
echo "<tr><td colspan=7><img src='gfx_bogstaver/aa.gif' width=12 height=12></td></tr>";
}
else
echo "<tr><td colspan=7><img src='gfx_bogstaver/".$first.".gif' width=12 height=12></td></tr>";
$prevfirst = $first;
}
?>
... osv... kode...
Det virker fint - BORTSET fra en mindre ting, nemlig brugen af eks "Å", den smider ikke "Å" ind til sidst:
#
10.000 BC
1408
2 Fast 2 Furious
3:10 to Yuma
A
A Beautiful Mind
Å
Å film-titel
A
A Good Year
B
Babel
Borat
Skrevet søn. d. 08. februar 2009 kl. 16:39:41| #18
Mit eksempel tilrettes til at håndtere ÆØÅ med:
<?php
function special_print($vals) {
//setlocale(LC_ALL, 'da_DK'); // *nix
setlocale(LC_ALL, 'dan_DNK'); // windows
sort($vals, SORT_LOCALE_STRING);
$prevfirst = '';
foreach($vals as $val) {
$first = $val[0];
if(is_numeric($first)) $first = '#';
if($first != $prevfirst) {
echo $first . "<br>\r\n";
$prevfirst = $first;
}
print $val . "<br>\r\n";
}
}
$vals = array("A Good Year", "Øresund", "2 Fast 2 Furious", "Borat", "Æblegrød", "3:10 to Yuma", "A Beautiful Mind", "Ålestrup", "1408", "Babel", "10.000 BC");
special_print($vals);
?>
Skrevet søn. d. 08. februar 2009 kl. 16:42:22| #19
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) !
Skrevet søn. d. 08. februar 2009 kl. 21:28:38| #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.
Skrevet søn. d. 08. februar 2009 kl. 21:37:57| #21
Som jeg skrve - sæt den rigtige kollation på din tabel og ORDER BY vil virke.
Skrevet søn. d. 08. februar 2009 kl. 22:14:43| #22
Hej igen,
Det er sikkert mig, der ikke fatter hat :-)
Min ORDER BY er:
$query = mysql_query("SELECT * FROM movies ORDER BY Titel asc");
Og alt står tilsyneladende til "utf8_danish_ci" i databasen.
Skrevet søn. d. 08. februar 2009 kl. 22:16:19| #23
Gør ingen forskel, hvis jeg sætter den til "latin1_danish_ci" i stedet...
Skrevet søn. d. 08. februar 2009 kl. 22:19:30| #24
Ups - nej, du havde ret. Kolonnen stod til "utf8_general_ci". Det virker nu.
Tusind tak for hjælpen! Svar gerne for point!
Skrevet man. d. 09. februar 2009 kl. 01:02:10| #25