$vv) $result[] = array( 'key' => $kk, 'name' => $vv['name'] ); return $result; } /** * Получает номер или тело объекта перечисления или пусто * Возвращает массив, описывающий объект перечисления * * @param $obj * @return array */ function nsamp_resolve_object($obj) { global $nsamp_objects; if(isset($obj) && is_array($obj)) return $obj; if(isset($nsamp_objects[$obj])) return $nsamp_objects[$obj]; return $nsamp_objects[NUMSAMP_OBJ_NOTHING]; } /** * Получает порядок группы перечисления * Возвращает массив, описывающий группу перечисления или пусто * * @param $n -- группа перечисления * @return array */ function nsamp_resolve_groupname($n) { global $nsamp_objects; global $nsamp_groupnames; if(isset($nsamp_groupnames[$n])) return $nsamp_groupnames[$n]; return $nsamp_objects[NUMSAMP_OBJ_NOTHING]; } /** * Получает объект или группу перечисления, число и падеж * Возвращает нужную слофоформу * * @param $obj -- объект перечисления * @return string */ function nsamp_form_word($obj, $num, $case) { // сюда число приходит уже без знака // считаем число единиц $n = intval( $num % 10 ); // считаем число десятков $nn = intval( ( $num - $n ) % 100 ) / 10; // если число десятков равно 1, слово всегда идет в форме NUMSAMP_NUM_MANY if($nn == 1) return $obj['forms'][NUMSAMP_NUM_MANY][$case]; // для прочих диапазонов работает следующий набор правил: // * если число единиц равно 1, то слово в форме NUMSAMP_NUM_ONE // * если число единиц равно 2,3 или 4, то слово в форме NUMSAMP_NUM_SOME // * если число единиц 0, или от 5 до 9, то слово в форме NUMSAMP_NUM_MANY return $obj['forms'][($n == 1? NUMSAMP_NUM_ONE : (($n > 1)&&($n < 5)? NUMSAMP_NUM_SOME : NUMSAMP_NUM_MANY ))][$case]; } /** * Получает числительное, род и падеж. * Формирует и возвращает словоформу числительного с учетом рода и падежа * перечисляемого объекта. * * @param $n -- числительное * @param $gender -- род * @param $case -- падеж * @return string */ function nsamp_form_number($n, $gender, $case) { global $nsamp_numbernames; if(!isset($nsamp_numbernames[$n])) return; return $nsamp_numbernames[$n]['forms'][( $nsamp_numbernames[$n]['gender_specific'] ? $gender : NUMSAMP_GENDER_ALL )][$case]; } /** * Получает число, объект и падеж. * Возвращает пропись числа объектов в падеже. * * @param $num -- число * @param $obj -- объект * @param $case -- падеж * @return string */ function nsamp_process_num($_num, $obj = NUMSAMP_OBJ_NOTHING, $case = NUMSAMP_CASE_NOMINATIVUS) { // т.к. не знаем, что пришло в качестве объекта, ресолвим объект в массив его описывающий $obj = nsamp_resolve_object($obj); // на всякий случай убеждаемся, что там нет минуса, дробной части и прочей гадости $num = abs( intval($_num) ); // если число = 0, возвращаем слово "ноль" в нужном падеже + словоформу объекта, соотвествующую // множественному числу родительному падежу (например, "ноль рублей"). if( $num == 0) return nsamp_form_number(NUMSAMP_ZERO, NUMSAMP_GENDER_MALE, $case)." ".nsamp_form_word($obj, 10, NUMSAMP_CASE_GENITIVUS); // определяем число групп по 3 цифры в каждой $groups = ceil(log($num+1, 1000)); $result = ''; // если надо, добавляем префикс "минус " if($_num < 0) $result .= 'минус '; $work_num = $num; // проходим по группам начиная со старшей for($i = $groups; $i > 0; $i--) { // определяем множитель группы (например, 1000 или 1000000) $power = pow( 1000, $i-1 ); // получаем состав этой группы (это будет число от 0 до 999) $part = floor( $work_num / $power ); // получаем массив, описывающий словоформы множителя текущей группы $power_word = nsamp_resolve_groupname( $power ); // если состав группы не пуст, формируем строку её описывающую, как // строку, описывающую состав группы с учетом рода (рода группы, если // группа не последняя, и рода объекта, если последняя) плюс строка // описывающую множитель группы if($part) $result.= nsamp_process_group($part, ($i == 1 ? $obj['gender'] : $power_word['gender'] ), $case)." ".nsamp_form_word($power_word, $part, $case)." "; $work_num -= $part * $power; } // если последняя группа была пустая, то прибавляем словоформу объекта, соотвествующую // множественному числу родительному падежу (например, "трёх тысяч рублей"). if( ($groups > 1) && !$part ) $result.= nsamp_form_word($obj, 10, NUMSAMP_CASE_GENITIVUS); // иначе прибавляем словоформу объекта, соотвествующую // указанному числу и указанному падежу. else $result.= nsamp_form_word($obj, $num, $case); return $result; } /** * Получает число, род и падеж. * Число всегда от 0 до 999 * Возвращает пропись числа для заданного рода в заданном падеже. * * @param $num -- число * @param $gender -- род * @param $case -- падеж * @return string */ function nsamp_process_group($num, $gender = NUMSAMP_GENDER_MALE, $case = NUMSAMP_CASE_NOMINATIVUS) { global $nsamp_numbernames; // на всякий, убеждаемся, что там всё в пределах тысячи $num = intval($num % 1000); $result = array(); // печатаем то, что больше 99 if($num>99) { $cur_part = floor( $num/100 )*100; $result[] = nsamp_form_number($cur_part, $gender, $case); $num -= $cur_part; } // печатаем то, что меньше 100, но больше 20 if($num>20) { $cur_part = floor( $num/10 )*10; $result[] = nsamp_form_number($cur_part, $gender, $case); $num -= $cur_part; } // печатаем то, что меньше 21 if($num>0) $result[] = nsamp_form_number($num, $gender, $case); // возвращаем конкатенацию return implode(' ',$result); } ?>
Fatal error: Call to undefined function nsamp_process_num() in /var/websites/www.forum-tvs.ru/ips_kernel/class_captcha_plugin/abcaptcha.php on line 121