Avatar billede Slettet bruger
07. februar 2009 - 15:33 Der er 24 kommentarer og
1 løsning

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?
Avatar billede arne_v Ekspert
07. februar 2009 - 15:49 #1
Avatar billede psychopixi Nybegynder
07. februar 2009 - 15:51 #2
Dette bestmmer om titlen starter med et heltal:
<?php
$string = "FILM_TITEL";
if((int) $string){
    // $string starter med et heltal.
}
?>
Avatar billede psychopixi Nybegynder
07. februar 2009 - 15:53 #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.
Avatar billede psychopixi Nybegynder
07. februar 2009 - 15:57 #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.
}
?>
Avatar billede psychopixi Nybegynder
07. februar 2009 - 16:01 #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.
Avatar billede mewm Nybegynder
07. februar 2009 - 16:23 #6
Hvorfor ikke bare
if(is_numeric(substr($title, 0, 1))) {
    #Først char er et ciffer
}
Avatar billede coderdk Praktikant
07. februar 2009 - 16:25 #7
is_numeric( $title[0] )

:)
Avatar billede arne_v Ekspert
07. februar 2009 - 17:02 #8
Nej. +10titel og -5titel vil ikke blive opfattet som tal.

Ganske vist er "+10" og "-5" tal, men det er "+" og "-" ikke.
Avatar billede nicklasb Nybegynder
07. februar 2009 - 17:07 #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);
Avatar billede 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];

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>";
}
}
Avatar billede nicklasb Nybegynder
07. februar 2009 - 22:01 #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.
Avatar billede nicklasb Nybegynder
07. februar 2009 - 22:02 #12
.. og så hedder funktionen selvfølgelig is_numeric. Altså:

    if (!is_numeric($checkChar))
        ...
Avatar billede psychopixi Nybegynder
07. februar 2009 - 22:28 #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 Å...
Avatar billede psychopixi Nybegynder
07. februar 2009 - 22:35 #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:)
Avatar billede psychopixi Nybegynder
07. februar 2009 - 23:07 #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.
Avatar billede arne_v Ekspert
08. februar 2009 - 02:27 #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);
?>
Avatar billede Slettet bruger
08. februar 2009 - 09:43 #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
Avatar billede arne_v Ekspert
08. februar 2009 - 16:39 #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);
?>
Avatar billede arne_v Ekspert
08. februar 2009 - 16:42 #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) !
Avatar billede 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.
Avatar billede arne_v Ekspert
08. februar 2009 - 21:37 #21
Som jeg skrve - sæt den rigtige kollation på din tabel og ORDER BY vil virke.
Avatar billede Slettet bruger
08. februar 2009 - 22:14 #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.
Avatar billede Slettet bruger
08. februar 2009 - 22:16 #23
Gør ingen forskel, hvis jeg sætter den til "latin1_danish_ci" i stedet...
Avatar billede Slettet bruger
08. februar 2009 - 22:19 #24
Ups - nej, du havde ret. Kolonnen stod til "utf8_general_ci". Det virker nu.

Tusind tak for hjælpen! Svar gerne for point!
Avatar billede arne_v Ekspert
09. februar 2009 - 01:02 #25
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester