Oprettet lør. d. 07. februar 2009 kl. 15:33:52

omalley
omalley (14.853 point. Point ude: 760)

Tjekke om første karakter er et ciffer

Hej - jeg har en database med film. Jeg tjekker efter titlens første bogstav til at lave noget i stil med:

A
A Beautiful Mind
A Good Year

B
Babel
Borat

osv...

Jeg gør det ved at tjekke første bogstav i titlen:
$checkChar = $Titel[0];

Men hvordan tjekkes det for om det første bogstav er et ciffer?

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

mewm
mewm (11.960 point)
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

coderdk
coderdk (159.874 point)
is_numeric( $title[0] )

:)

Skrevet lør. d. 07. februar 2009 kl. 17:02:42| #8

arne_v
arne_v (1.005.623 point)
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

omalley
omalley (14.853 point)
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

arne_v
arne_v (1.005.623 point)
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

omalley
omalley (14.853 point)
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

arne_v
arne_v (1.005.623 point)
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

arne_v
arne_v (1.005.623 point)
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

omalley
omalley (14.853 point)
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

arne_v
arne_v (1.005.623 point)
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

omalley
omalley (14.853 point)
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

omalley
omalley (14.853 point)
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

omalley
omalley (14.853 point)
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


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Ville ikke tildele at upload det til database eller komme...

Oprettet den 10. februar 2012 kl. 21.23
tobrukDk giver 15 point for svar | Giv et svar »

HTTP Post XML og modtag svar

Oprettet den 10. februar 2012 kl. 17.55
mrkaynex giver 200 point for svar | Giv et svar »

Inspion Economy søger en dygtig programmør, som kan...

Oprettet den 10. februar 2012 kl. 16.09
Kathja giver 15 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger