Skip to content

Instantly share code, notes, and snippets.

@Glutexo
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Glutexo/9463020 to your computer and use it in GitHub Desktop.
Save Glutexo/9463020 to your computer and use it in GitHub Desktop.
Funkce pro hezké české vyskloňování podstatného jména.
// Vyskloňuje slovo hezky česky buď podle staršího,
// méně benevoletního a méně prasáckého paradigmatu:
// 1 položka, 2 položky, 5 položek, 10 položek,
// 15 položek, 20 položek, 21 položka, 22 položky
// 25 položek, 100 položek, 101 položka…
// nebo podle nového, čuňáckého:
// 1 položka, 2 položky, 5 položek, 10 položek,
// 15 položek, 20 položek, 21 položek, 22 položek
// 25 položek, 100 položek, 101 položek…
//
// Volání: decline(123, 'položka', 'položky', 'položek');
// Pozn.: Funguje jen pro nezáporná celá čísla.
function decline($val, $nom_sg, $nom_pl, $gen_pl,$nice = true) {
if($nice) {
$last_h = substr($val, -2);
$last_d = substr($val, -1);
if(($last_h >= 5 && $last_h <= 20) || $last_d == 0) {
$suffix = $gen_pl;
} else {
if($last_d == 1) {
$suffix = $nom_sg;
} elseif($last_d >= 5) {
$suffix = $gen_pl;
} else {
$suffix = $nom_pl;
}
}
} elseif($val == 1) {
$suffix = $nom_sq;
} elseif($val > 0 && $val < 5) {
$suffix = $nom_pl;
} else {
$suffix = $gen_pl;
}
return $suffix;
// Možno vracet i celé číslo, ne jen počítací slovo.
// Pozn.: Ani tvrdá mezera, ani např. &nbsp; nelze
// použít jako parametr funkce number_format, neboť
// se nevyrovná s tím, že je tento parametr delší
// než jeden bajt.
$str = number_format($val, 0, ',', '*');
$str = str_replace('*', ' ', $str); // tvrdá mezera
// Pozn.: Nepoužijeme-li chlupaté závorky, PHP si
// bude myslet, že ta tvrdá mezera je součást názvu
// proměnné.
return "{$str} {$suffix}";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment