Как я уже говорил — моя практика в университете заключается в том, что я должен написать приложение на php, которые будет подсчитывать количество повторяющихся в тексте символов и которые строго определены в конфиге (который может содержаться и в текстовом файле и просто передаваться через textarea). Как только мне задали это задания — я подумал о Google Charts о котором недавно читал на хабрахабре.
Вчера я сел и написал это небольшое приложение:
function graphfile($SUPPORTCHARS, $file=false, $text=false)
{
$str = array(); //for sting
$ch=0;
if($text && !$file)
{
$file = fopen("tmp/tmp.txt", "w");
fwrite($file, $text);
fclose($file);
$file = fopen("tmp/tmp.txt", "r");
}
while(!feof($file))
{
$str = fgets($file);
$lenstr = strlen($str);
for($i=0;$i<=$lenstr;$i++)
{
if($str[$i]!=NULL && strstr($SUPPORTCHARS, $str[$i]))
{
$pt = $ch;
$tr = 0;
for($j=0;$j<$ch;$j++)
{
if($chars[$j][1]==$str[$i])
{
$pt = $j;
$tr = 1;
}
}
if($tr!=1)
{
$chars[$pt][1]=$str[$i];
$chars[$pt][0]=0;
}
for($j=0;$j<=$lenstr;$j++)
{
if($str[$j]==$chars[$pt][1])
{
$str[$j]=NULL;
$chars[$pt][0]++;
}
}
if($tr!=1) $ch++;
}
}
}
fclose($file);
$charturl = "http://chart.apis.google.com/chart?cht=bvs&chxt=x,y,x&";
$width = $ch*20;//chs=$widthx$height;
$height = 400;
do{
$height--;
$width--;
}while(($width*$height)>300000 || $width>1000);
sort($chars);
$vars = "0:|";
$data = "2:|";
$maxv = 0;
$chb = 15;
for($i=0;$i<$ch;$i++)
{
$vars .= $chars[$i][0]."|";
$data .= $chars[$i][1]."|";
if($chars[$i][0]>$maxv) $maxv = $chars[$i][0];
}
$charturl .= "chs=".$width."x".$height."&";
$simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
$chartData = "s:";
for ($i = 0; $i < $ch; $i++) {
$currentValue = $chars[$i][0];
if ($currentValue > -1) {
$chartData.=substr($simpleEncoding,61*($currentValue/$maxv),1);
}
else {
$chartData.='_';
}
}
$charturl .= "chd=".$chartData."&chbh=".$chb."&chco=76A4FB&chxl=".$vars."1:|0|".($maxv/2)."|".$maxv."|".$data;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=<?=$_CHARSET;?>" />
<title><?=_TITLE;?></title>
</head>
<body>
<h3><i><?=_TITLE;?></i></h3>
<p><i><?=_GRAPHTITLE;?></i></p>
<?=$error;?>
<table>
<tr>
<td>
<?php
echo "<a href = \"".$charturl."\" target = \"_blank\"><img src = \"".$charturl."\" border = \"0\" width = \"".$width."\" height = \"".$height."\"/></a>";
?>
</td>
</tr>
<tr>
<td>
<a href = "index.php"><?=_NEWGRAPH?></a>
</td>
</tr>
</table>
</body>
</html>
<?php
}
В прочем в построении графика не было ничего необычного. С помощью отдельной функции я считал повторяющиеся в тексте символы, которые разрешены для учета.
Те, кому не терпится посмотреть исходных код программы я могу предложить посмотреть исходный код функции, которая обрабатывает данные из файла и строит графики.
Если что-то не понятно — вопрос можно задать в комментариях :)
Посмотреть исходный код функции
P.S. Строка «При построении используется Google Api поэтому Вам необходимо соединение с интернет.» нужна только для преподавателя, который будет этим чудом пользоваться, тк. скрипт будет доступен ему локально :)
слово упустил в посте. повторяющихся чего? :)
кстати, посмотрел на вывод — по y-количество попаданий,а число по х? Номер буквы в алфавите?
кстати, а там можно как-нибудь оптимизировать процесс отправки данных к Google Charts?
Ну например, чтобы не был такой огроменный гет-запрос.
пс2. вставь в программу фильтр текстового поля(там jscriptы всякие, xss) на всякий случай, или закрой доступ к скрипту.
Да, про слово это ты четко подметил :))
Ну можно написать ещё один скрипт, который кодирует этот длинный юрл в короткий, например ))) Типа flush url для wordpress'a. Но это уже излишки. На практике будет применятся файлы размером чуть больше 20000 символов. Так что нет нужды.
XSS исключен. Все обрабатывается по фильтру, так что если ты и скормишь скрипту код какой-нибудь — все равно эффект будет нулевой + при вызове функции все обрабатывается htmlspecialchars и addslashes'ом. Думаю с этим проблем возникнуть не должно :)
ну, а где список использованных буковок? О_о
Переменная $SUPPORTCHARS. В неё у меня в конфиге весь латинский и русский алфавит а так же буквы (:
Нафига мне твоя переменная? Я хочу видеть на нрафике, сколько каких букф было использовано! :)
Ну как бы внизу смотри...
Сам смотри: img-fotki.yandex.ru/get/3...63_7e839478_orig
Гг )) Видимо с линуха проблемы )) Надо будет оптимизировать )))
Это винда. Впрочем, под линем та же байда. И там, и там — FF.
Проблему вроде бы решил )) Тк. сам сижу под оперой и там и там, то просто не думал что возникнут проблемы с кодировкой :) Оказалось и на осле мелкософтовом тоже были проблемы, сходные с твоей. Так что теперь все должно нормально работать. Разве что не понимает файлы в кодировке utf-8. Только в cp1251 и windows-1251.
Теперь вообще графика нет)))
но это под линем.
Да я так заметил , что гугл дало возможность развиваться нам всем. Даже страшно представить сколько сервисов появилось по построению диаграм. Сам даже на своём блоге поднял. Прогу написал для генерации javascript кода. Прям гугл — школа программирования. Я конечно проще делал свой сервис через echo «code». Но это кому — что нравится.