Borgar.net

— Go straight to page navigation

24. maí 2005

Forritunargátan

Það var lögð fyrir mig forritunargáta áðan sem er svona:

if (substr($fjoldi, strlen($fjoldi) - 1, 1) == 1
    && substr($fjoldi, strlen($fjoldi) - 2, 1) != 1)

Hvað gerir þetta og í hvað er það notað?

Svarið er sennilega ekki augljóst. Það var það þó fyrir mig vegna þess að ég hef gert þetta áður. Þetta athugar hvort að síðusta stafurinn í tölu sé 1 og hvort að næst síðasti stafurinn sé það ekki.

Þetta er notað til þess að athuga hvort að orð eru í fleirtölu í íslensku. Töluorð sem enda á 1 stýra eintölu nema ef þau enda á 11, þá krefjast þau fleirtölu.

Eina vandamálið er að þessi kóði virkar ekki. Hann klikkar ef hann fær töluna 1 inn.

Vandamálið er undarleg hegðun í PHP sem veldur því að ef byrjunin á streng sem á að klippa úr öðrum lendir fram fyrir byrjun strengsins þá virðist vera talið frá fyrsta staf.

return substr("test", -16, 1) // skilar "t".

Það er svosem hægt að komast hjá þessu vandamáli með því að skella t.d. bili framan á strenginn áður en hann er metinn, en það er ekki alvöru lausn.

Mér finnst besta leiðin til þess að gera þetta vera reikniaðferð. Þá er þetta gert svona:

function is_plural($val) {
  return (($val-1) % 10) && (($val-11) % 100);
}

Verði ykkur að góðu.

Uppfært: 22. Maí 2006:

Ég lagaði bæði færsluna og einfaldaði kóðann örlítið. Það má einnig skrifa þetta svona:

function is_plural($val) {
  return !(($val % 10) == 1) && (($val % 100) !== 11);
}

Það verður örlítið lengri kóði í PHP, en í öðrum forritunarmálum gæti þetta verið styttra.

Published: 24. maí 2005. Tagged: , , , .