Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Сниппеты » PHP Сниппеты » PHP Функция для установки правильного окончания слов

PHP Функция для установки правильного окончания слов


     01.09.2013    сниппет, php, окончания слов    PHP Сниппеты    4449

Недавно понадобилась такая функция, после поисков выяснилось, что готовых решений не так уж и много.
В итоге Sander подсказал вот такую штуку:
/**
* Функция для установки правильного окончания слов
* @param int $n - число, для которого будет расчитано окончание
* @param string $words - варианты окончаний для (1 комментарий, 2 комментария, 100 комментариев)
* @return string - слово с правильным окончанием
*/
function wordsSpan($n = 0, $words) {
    $words    = explode('|', $words);
    $n        = intval($n);
    return  $n%10==1&&$n%100!=11?$words[0].$words[1]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$words[0].$words[2]:$words[0].$words[3]);
}

// Пример работы
for ($total=0; $total < 102; $total++) {
    echo 'Всего: '.$total.' '.wordsSpan($total,'комментари|й|я|ев').'<br />';
}

// Вариант с подключением в DLE
// {include file="engine/modules/wordspan.php?n=7&words=комментари|й|я|ев"}

17 комментариев

User_3218
Юзер

User_3218 - 30 июля 2014 22:41 -

Функция не работает!!!

vitnet
Эксперт

vitnet - 30 июля 2014 22:55 -

function wordsSpan($n = 0, $words) {
    $words    = explode('|', $words);
    $n        = intval($n);
    return $n%10==1 && $n%100!=11 ? $words[0] . $words[1] : ($n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? $words[0] . $words[2] : $words[0] . $words[3]);
}

echo 'Всего: ' . $n . ' ' . wordsSpan($n, 'комментари|й|я|ев');

FastFud
Юзер

User_3218
Юзер

User_3218 - 30 июля 2014 23:02 -

Fatal error: Cannot redeclare wordsspan() (previously declared in /public_html/engine/modules/wordspan.php:14) in /public_html/engine/modules/wordspan.php on line 18

vitnet
Эксперт

vitnet - 30 июля 2014 23:13 -

function wordsSpan(...
была объявлена ранее

User_3218
Юзер

User_3218 - 30 июля 2014 23:27 -

Подскажите, пожалуйста, куда вставить эту строчку в index.php
"$tpl->result['main'] = preg_replace("#\[declination=(\d+)\](.+?)\[/declination\]#ies", "word_declination('\\1', '\\2')", $tpl->result['main']);"
На сайте написано найти "echo $tpl->result['main'];", но, к сожалению, этого нет в движке 9.8

vitnet
Эксперт

vitnet - 30 июля 2014 23:39 -

Как нету?

Смотрите внимательнее
echo $tpl->result['main']; // <-- 
$tpl->global_clear ();
$db->close ();

echo "\n<!-- Dat..... -->\r\n";

GzipOut();
?>

User_3218
Юзер

User_3218 - 30 июля 2014 23:49 -

У меня нет такого, вот что есть "eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');", значит, перед ней, я так понимаю вставить нужно)

User_3218
Юзер

User_3218 - 31 июля 2014 00:05 -

????

ПафНутиЙ
Админ

ПафНутиЙ - 31 июля 2014 00:09 -


Каков вопрос - таков и ответ. Просто помните об этом.

User_3218
Юзер

User_3218 - 31 июля 2014 00:17 -

Спасибо, Пафнутий) А по поводу php все же хотелось бы узнать! Правильно ли вставить перед этой строкой "eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');"
--
Первая ссылка не работает( ***Sorry, but the page you are trying to view does not exist.***
За пример - спасибо)

D0Gmatist
Местный

D0Gmatist - 31 июля 2014 00:30 -

function declination($num, $postfixes)
    {
    $num = $num % 100;
    if ($num > 19) {
        $num = $num % 10;
    }
    switch ($num) {
        case 1:
            return $postfixes[0];
        case 2:
        case 3:
        case 4:
            return $postfixes[1];
        default:
            return $postfixes[2];
    }
}

$question = "2";
$question_decl = declination( $question, array( 'вопрос', 'вопроса', 'вопросов' ) );

echo $question . " " . $question_decl; // 2 вопроса

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

D0Gmatist
Местный

D0Gmatist - 31 июля 2014 00:39 -


Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

User_3218
Юзер

User_3218 - 31 июля 2014 00:59 -

Вопрос остается акуальным. Простите, я не разбираюсь в php, поэтому прошу помощи у знатоков..

Подскажите, пожалуйста, куда вставить эту строчку в index.php
"$tpl->result['main'] = preg_replace("#\[declination=(\d+)\](.+?)\[/declination\]#ies", "word_declination('\\1', '\\2')", $tpl->result['main']);"


Будет ли это решение правильным!?

$tpl->set ( '{AJAX}', $ajax );
$tpl->set ( '{headers}', $metatags."\n".$js_array );

$tpl->set ( '{content}', "<div id='dle-content'>" . $tpl->result['content'] . "</div>" );

$tpl->compile ( 'main' );
$tpl->result['main'] = str_ireplace( '{THEME}', $config['http_home_url'] . 'templates/' . $config['skin'], $tpl->result['main'] );
if ($replace_url) $tpl->result['main'] = str_replace ( $replace_url[0]."/", $replace_url[1]."/", $tpl->result['main'] );
$tpl->result['main'] = str_replace ( '<img src="http://'.$_SERVER['HTTP_HOST'].'/', '<img src="/', $tpl->result['main'] );


$tpl->result['main'] = preg_replace("#\[declination=(\d+)\](.+?)\[/declination\]#ies", "word_declination('\\1', '\\2')", $tpl->result['main']);

eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');
$tpl->global_clear ();
$db->close ();

echo "\n\r\n";

GzipOut();
?>

User_3218
Юзер

User_3218 - 31 июля 2014 01:00 -


D0Gmatist
Местный

D0Gmatist - 31 июля 2014 01:06 -


Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

User_3218
Юзер

User_3218 - 31 июля 2014 01:22 -

D0Gmatist,
спасибо большое за помощь! Все работает прекрасно! ;)

Чтобы комментировать - войдите или зарегистрируйтесь на сайте
наверх