Я тоже писал им такую функцию. Получилось так:
PHP:
<?php
function dateDiffInMonths($data1, $data2) {
$year1=substr($data1, 0, 4);
$month1=substr($data1, 5, 2);
$day1=substr($data1, 8, 2);
$year2=substr($data2, 0, 4);
$month2=substr($data2, 5,2);
$day2=substr($data2, 8, 2);
$JDCdata1=GregorianToJD($month1, $day1, $year1);
$JDCdata2=GregorianToJD($month2, $day2, $year2);
return ($JDCdata2-$JDCdata1)/30;
}
echo dateDiffInMonths('2007-07-05', '2007-11-05')."<br>";
echo dateDiffInMonths('2007-07-05', '2008-07-25')."<br>";
echo dateDiffInMonths('2008-06-01', '2008-07-05');
?>
-~{}~ 04.05.08 11:15:
Потом попросили решить такую задачу.
Пункт 1 (а,б) является обязательным. Пункты 2 и 3 выполняются по желанию кандидата.
Существует входной параметр в виде случайного текста (строки).
В тексте встречаются вызовы функций PHP для работы со строками с простыми (скалярными) аргументами.
Каждая функция имеет один аргумент.
Аргументы являются случайными строками, ограниченными одинарными кавычками.
Синтаксических ошибок в функциях и аргументах нет.
Примеры текста:
---
вpю rtrim('xrщ') fqншжх)on fюd crc32('рiз((хрирo lc') mxуra crc32('bftвл') кc trim('aц') brzmхуyвтт addslashes('гeeээдiцрr') жfpщжkгzpnч
md5('хвe)толzl(pz') jvбвyфг)ач(y strtoupper('vяssтууcхбwб') гoуцщ о )мyjюч trim('у)нскrсpanfвэх') iгаоyтk strtoupper('d yjq k') хd rtrim('qч') едeп
strtoupper('цхt)') огqв buжtqрc strlen('dsкфумqхmмох') цю(jeеfэ оv trim('xюб)щtниtжм') pнмзмnvgюvcvc strtolower('xмеnмуtмвfя(j') nэwqфxur
striptags('iцяэm( э') зу(j ltrim('liтw') чaеу)з(ej strtoupper(' yozidсyх') иdлprбч(цniyкy ltrim('xнмбqyayющfuка') вoktеiгjсjvdфмq
addslashes('юykeчшжэууuizдc') b м txзmгрхrrnц crc32('юцзяcфжg()ржwхе') вa )a striptags('мjмfяо') nщфи rtrim('gkfz') dк umаэaхвlv strtoupper('atап qэ
ждфд') )пjхlтbкdдю striptags('ff(sqg xaлf') toeqоcjoaм htmlspecialchars('щчfэ dcвюm') bдnppjиlw strtolower('p fvрпнiя') тrtщкп ( пly(fd
ltrim('zqbgеedd(шлсaxп') ufр(lцоppшb strtolower('хcфнвфvzзэт') упygqctсч crc32(' бнrr бwу') бwvя metaphone('нжfб') ry metaphone('яd') xdщklщfu)jф(еr
metaphone('kbeцжlялkoксмя') лcxбp)zц md5('иnxixгзш')
---
бkjжщезкю strtoupper('borвbиpnд') еg(m crc32('awlt') lnфлv htmlspecialchars('yжwyz') mnзчsвavофдцт addslashes('q)гuapyt барч') dишгpзржвумюпс
metaphone('эwзgvгюкодфbнy') iомigжlsсмдyi ltrim('иcfsэsшfvцcав') oourцeeq( htmlspecialchars('yкgzzдcvтр') pzz addslashes('ffw') uшфm ousyw crc32('фоюv
nчупa') mtд юпсфиjdzб strtoupper('егqlкdm nтalэ') эреpжюнхoж addslashes('цнcоxbo)id') оg(гн дф metaphone('уэf eхчн') бх strtoupper('nк') iсбsti
trim('dлжмz ') яучrуэmrю md5('еожyцaz)г') ффжеqdzv addslashes('сiжkfglг') uщ rtrim('шr') дx libсе кл crc32('раiжиxlяsчq') iеwцтю b metaphone('у ссац)a')
иz)mрfщаgмtяt md5('мzqiбuzфeгхмk') хч xz htmlspecialchars('ktiba') тnwoi)рcчejчю strtolower('ке гxмcфuiчmчб')
---
cокn(o strlen('жpuпюз') dxieiк trim(' vмаос') iрн strlen(' шj') ла trim('tw') mu яmp striptags(' мнфч ') awkс сeтx strtoupper('sicnбwукkj') mгрl)dсgа абд
trim('киодxtюяеaм)p') эwpkfgхцo rtrim('жфхну сgj') вtялdюхw ю htmlspecialchars('оb oщшgухv') pц strlen('т ') цэз lдtsgo e strlen('kлlcюf вгкju') чngma фaщ
trim('уdкuc( lg') ge nшv)otюnвr htmlspecialchars('fc екдbшm)уфщ') шнb rtrim('гuс') аlwvя) флj pуг crc32('yevдsхзезкгчpт') w( wмшwгзацпоша
ltrim('юо)nр(пуeyoсвbщ') юz crc32(' у') сvdвюкqцaеvs ltrim('вфcвrдмуtblщ') rpдэф strtoupper('zюшюуjа') пsбgсвinчo md5('rартkзбмlн') bmопожfщуd
rtrim('рagжrнд)ny') скгsрbлэyи htmlspecialchars('lхщwиt ю(') zгoбdmcи strtoupper('vююgчт(в') b шжфx )zy)f кс addslashes('цbup(sзб елсмsm') жрзrнsx
ltrim('xp пфfю')
---
1) Используя ООП(PHP 5), реализовать инструмент, решающий следующие задачи:
а) Заменить во входном тексте все вызовы функций PHP на результат их выполнения и получить результирующий текст
б) Сформировать XML (в виде строки) следующей структуры:
<root>
<func function="f" result="x" position="y" arg="z">
...
</root>
root - корневой узел
func - узел с данными одной функции
function="f" - имя функции
position="y" - позиция первого символа функции во входном тексте
result="x" - результат выполнения функции
arg="z" - аргумент функции
Таким образом, XML должен содержать данные по всем найденным функциям и их аргументам
2) (XSLT) Cоставить XSLT-шаблон, результат применения которого к получаемому в пункте 2 XML-дереву
будет представлять собой HTML-страницу с информацией по функциям и их аргументам.
Написать php-файл, выполняющий XSLT-преобразование и вывод
3) (mysql) Cпроектировать бд mysql, предназначенную для хранения информации о функциях и аргументах.
Написать php-файл выполняющий основные операции по работе с этой бд - вставка, просмотр, редактирование, удаление.
Решение:
PHP:
<?php
class Zam_Func {
public $text;
function zam() {
$v="/(\w+)\('(.*?)'\)/m";
function zamena($k){
if (function_exists("$k[1]")) {
return $k[1]($k[2]);
}
else {
return "$k[0]";
}
}
return preg_replace_callback($v,"zamena",$this->text);
}
function xml() {
$v="/(\w+)\('(.*?)'\)/m";
preg_match_all($v,$this->text,$p,PREG_OFFSET_CAPTURE);
$str="<root>\n";
for ($i=0; $i<count($p[1]); $i++) {
$function=$p[1][$i][0];
if (function_exists("$function")) {
$position=$p[1][$i][1];
$arg=$p[2][$i][0];
$result=$function($arg);
$str=$str."<func function=\"$function\" result=\"$result\" position=\"$position\" arg=\"$arg\">\n";
}
}
$str=$str."</root>";
return $str;
}
}
$text="cокn(o strlen('жpuпюз') dxieiк trim(' vмаос') iрн strlen(' шj') ла trim('tw') mu яmp striptags(' мнфч ') awkс сeтx strtoupper('sicnбwукkj') mгрl)dсgа абд
trim('киодxtюяеaм)p') эwpkfgхцo rtrim('жфхну сgj') вtялdюхw ю htmlspecialchars('оb oщшgухv') pц strlen('т ') цэз lдtsgo e strlen('kлlcюf вгкju') чngma фaщ
trim('уdкuc( lg') ge nшv)otюnвr htmlspecialchars('fc екдbшm)уфщ') шнb rtrim('гuс') аlwvя) флj pуг crc32('yevдsхзезкгчpт') w( wмшwгзацпоша
ltrim('юо)nр(пуeyoсвbщ') юz crc32(' у') сvdвюкqцaеvs ltrim('вфcвrдмуtblщ') rpдэф strtoupper('zюшюуjа') пsбgсвinчo md5('rартkзбмlн') bmопожfщуd
rtrim('рagжrнд)ny') скгsрbлэyи htmlspecialchars('lхщwиt ю(') zгoбdmcи strtoupper('vююgчт(в') b шжфx )zy)f кс addslashes('цbup(sзб елсмsm') жрзrнsx
ltrim('xp пфfю')";
$obj= new Zam_Func;
$obj->text=$text;
$res=$obj->zam();
echo "$res";
echo "\n";
$xml=$obj->xml();
echo "$xml";
?>