Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск по массиву и перемещение курсора

54K
07 июня 2010 года
lousx
24 / / 26.04.2010
Читаю данные из csv в массив. (fgetcsv)
GET'ом отправляю значение (дату) в переменную.
Задача состоит в том, чтобы fgetcsv() выводила данные в массив не с начала файла, а со строки, которой соответствует значение отправленной переменно (дата).

Мой csv:
 
Код:
24.12, 22, 54,
25.12, 24, 48,
26.12, 25, 57,
27.12, 21, 57,
28.12, 01, 58,
29.12, 44, 45,
30.12, 22, 54,
31.12, 31, 44,


На страничке есть форма, куда нужно ввести дату, с которой должны выводится данные.
Например с 27.12

Вот сам скрипт:

Код:
$handle = fopen("test.csv", "r");
$c = 0;
$x =0;
$f = 0;

$r=0;

/* gets data from csv file */
while (($adata = fgetcsv($handle, 1000, ",")) !== FALSE) {
/* stores dates as variable $date */
       
       

     
       
        $datexx[$x] = $adata[0];
       $x++;
       
        $date[$c] = $adata[1];
       $c++;
       
       $dateff[$f] = $adata[2];
       $f++;
       
        /* inserts defect data into html code */
     
     
   
       
}
Страницы:
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
 
Код:
$date = $_GET["date"]; //берем дату
$contents = file_get_contents("test.csv"); //читаем csv
$contents = substr($contents, strpos($date)); //режем лишнее
$adata = str_getcsv($contents); //парсим csv
unset($contents); //чистим память
54K
07 июня 2010 года
lousx
24 / / 26.04.2010
verybadbug, как я понимаю Вы привели код, которым мы выдернем массиы с какой либо даты до конца. Можете доработать до такого вида, которым можно выдернуть кусок массива с заданными начальной и конечной точками...
Пока ждал ответа немножко посидел сам и сделал такой вариант:
Код:
if (!empty($_GET["first"])&&!empty($_GET["second"]))
{

$ot = $_GET["first"];
$do = $_GET["second"];


$good = array_keys ($datexx, $ot);

foreach($good as $k=>$v);



$kolichestvo = count($date);


$gooddo = array_keys ($datexx, $do);

foreach($gooddo as $kdo=>$vdo);



$kolsim = $vdo - $v;


$newdatexx = array_slice($datexx, $v, $kolsim);

$newdate = array_slice($date, $v, $kolsim);

$newdateff = array_slice($dateff, $v, $kolsim);


Кстати, массив разивается на "столбики". не знаю терминалогию, ибо с php сталкнулся впервые.

Вот первый кусок кода:

Код:
$handle = fopen("test.csv", "r");
while (($adata = fgetcsv($handle, 1000, ",")) !== FALSE) {
/* stores dates as variable $date */
       
       
     
       
        $datexx[$x] = $adata[0];
       $x++;
       
        $date[$c] = $adata[1];
       $c++;
       
       $dateff[$f] = $adata[2];
       $f++;
       

       
}
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
сначала работаем с данными, как с текстом - режем, как вам будет угодно
Код:
$contents = file_get_contents("test.csv"); //читаем csv как текст
$first = $_GET["first"];
$second = $_GET["second"];
$start = strpos($contents, $first); //ищем начало
if ($start === false) { die("Дата {$first} не найдена"); }
$end = strpos($contents, $second, $first); //ищем конец
if ($end === false) { die("Дата {$second} не найдена"); }
$contents = substr($contents, $start, $end - $start); //режем лишнее
$adata = str_getcsv($contents); //парсим csv
unset($contents); //чистим память

print_r($adata); //смотрим, что получилось


ps: необходимо учесть, что требуется обработка переданных пользователем данных и логических ошибок
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx
Кстати, массив разивается на "столбики"



тогда вместо $adata = str_getcsv($contents); //парсим csv
пишем

 
Код:
$items = explode("\n", str_replace("\r", "", $contents)); //преобразуем текст в массив строк
foreach ($items as $value) { //работаем построчно (для каждой строки)
  $adata = str_getcsv($value); //парсим csv
  //ваши данные [] - добавление нового элемента
  $datexx[] = $adata[0];
  $date[] = $adata[1];
  $dateff[] = $adata[2];
}
unset($items); //чистим память
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
в принципе будет работать и первый ваш вариант, если добавить условия отбора
Код:
$do_add = false;
...
while (($adata = fgetcsv($handle, 1000, ",")) !== FALSE) {
  if (!$do_add) { $do_add = $adata[0] == $first; }
  if ($do_add) { $do_add = $adata[0] != $second; }
  if ($do_add) {
    $datexx[] = $adata[0];
    $date[] = $adata[1];
    $dateff[] = $adata[2];
  }
}
54K
07 июня 2010 года
lousx
24 / / 26.04.2010
Отбирать нужно так: Если есть перваня, то с первой и до конца.
Если есть вторая, то сначала и до второй.
Если обе, то с первой до второй.
Кстати, не понимаю условие отбора в приведенном выше примере.

Есть еще масса вопросов.

Каким образом вывести результат выполнения скрипта с параметрами на html страницу?
Код:
<html>
<head>
</head>
<body>
<img src = "new.php">
<FORM ACTION="new.php" METHOD="GET">
<INPUT TYPE="text" NAME="first" SIZE="100" MAXLENGTH="100">
<INPUT TYPE="text" NAME="second" SIZE="100" MAXLENGTH="100">
<INPUT TYPE="Submit" VALUE="Построить">
</FORM>
</HTML>
</body>
</html>

После ввода даты переадресовывает на new.php?first=параметр&second=параметр.
Хотелось бы, чтобы после ввода данных и нажатия на кнопку, т.е. выполнения скрипта выводился на той же странице результат выполнения скрипта, т.к. там находятся формы ввода. Подумывал о варианте с frame, но думаю есть более правильно решение.

Даннык в csv имеют вид:
 
Код:
24.12 23:15, 22, 54,
24.12 23:18, 24, 48,
24.12 23:20, 25, 57,
25.12 00:12, 21, 57,
25.12 00:15, 01, 58,
25.12 00:20, 44, 45,


Можно ли в таком случае реальзовать выборку из массива по датам, без времени?
Т.е. необходимо сделать, чтобы указав в запросе 25.12 данные выводились бы начиная с певрого совпадения, то бишь эти 25.12 00:12, 21, 57 ?

Как я понимаю, нужно построчно проверять на совпадение 25.12? Как это реализуется?

Прошу прощения за большое количество вопросов, возможно не интересных или даже глупых, за не знание терминалогии.
verybadbug, Вам отдельное человеческое спасибо... Вы единственный, кто откликнулся из 3 крупных форумов... Везде только выпендриваются, кидаются ссылками, или рассказывают обо всем в общих словах, что я и сам в состоянии понять. Низкий Вам поклон
54K
07 июня 2010 года
lousx
24 / / 26.04.2010
Было прекрасно сделать выпадающие списки с выбором года, месяца, и дня... но это сверх мастерство.
Пока писал мысль пришла. А ведь на сколько я знаю можно сделать 3 выпадающих списка соответственно: год, месяц, дата и выбрав данные и отправив сделать так, чтобы скрипт сформировал данные в переменную. Не могу нормально излагаться. В общем выбрали год, месяц, день и скрипт сложил бы эти данные в 10.12.2009, записал их в переменную и ее принял бы, например за начальную дату и так же с конечной. Это же реально сделать, не правда ли? И мне помниться я где-то встречал функции для работы с текстом, слияние слов, строк и прочего. Даже, если я не ошибаюсь, если переменные имеют строковые значения то простым $a = хорошая $b= корова $x = $a + $b в результате Хорошаякорова? Конечно могу ошибаться. Очень на мой взгляд интересная мысль, хотя она наверно просатая и всё этим пользуются...

Что думаете по этому поводу? Реально ли? Сложно? Возможно? Рабочему примеру цены бы не было.
verybadbug, конечно же вся надежда на Вас.
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
пример работы со списком + в одном файле и форма, и вывод результатов

Код:
<?
//функции для построения списков
function day_options($current) {
  $r = "";
  for ($i = 1; $i <= 31; $i++) {
    $s = $i == $current ? " selected" : "";
    $r .= "<option value=\"{$i}\"{$s}>{$i}</option>";
  }
}
function month_options($current) {
  $month_names = array("Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек");
  $r = "";
  for ($i = 1; $i <= 12; $i++) {
    $s = $i == $current ? " selected" : "";
    $r .= "<option value=\"{$i}\"{$s}>" . $month_names[$i] . "</option>";
  }
}
function year_options($current) {
  $r = "";
  $i_max = date("Y");
  for ($i = $i_max - 5; $i <= $i_max; $i++) {
    $s = $i == $current ? " selected" : "";
    $r .= "<option value=\"{$i}\"{$s}>{$i}</option>";
  }
}
//читаем параметры
$start_day = 0 + (array_key_exists("start_day", $_GET) ? $_GET["start_day"] : 0);
$start_month = 0 + (array_key_exists("start_month", $_GET) ? $_GET["start_month"] : 0);
$start_year = 0 + (array_key_exists("start_year", $_GET) ? $_GET["start_year"] : 0);
$end_day = 0 + (array_key_exists("end_day", $_GET) ? $_GET["end_day"] : 0);
$end_month = 0 + (array_key_exists("end_month", $_GET) ? $_GET["end_month"] : 0);
$end_year = 0 + (array_key_exists("end_year", $_GET) ? $_GET["end_year"] : 0);

//необходимая обработка данных
$page_content = "";
if ($start_day) { $page_content = "ля-ля-ля"; }
?>

<form>
<select name="start_day"><? print(day_options($start_day)) ?></select>
<select name="start_month"><? print(day_options($start_month)) ?></select>
<select name="start_year"><? print(day_options($start_year)) ?></select> <br />
<select name="end_day"><? print(day_options($end_day)) ?></select>
<select name="end_month"><? print(day_options($end_month)) ?></select>
<select name="end_year"><? print(day_options($end_year)) ?></select> <br />
<input type="submit" />
</form>

<? if ($page_content != "") { print($page_content); } ?>
339
07 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx

Можно ли в таком случае реальзовать выборку из массива по датам, без времени?



Код:
$do_add = (первая дата указана) ? true : false; //флаг добавления
...
while (($adata = fgetcsv($handle, 1000, ",")) !== FALSE) {
  if (!$do_add) { $do_add = substr($adata[0], 0, 5) == $first; } //при снятом флаге: если строка соответствует первой дате - устанавливаем флаг
  if ($do_add) {
    $do_add = substr($adata[0], 0, 5) != $second; //при установленном флаге: если строка соответствует второй дате - снимаем флаг
    break;
  }
  if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
    $datexx[] = $adata[0];
    $date[] = $adata[1];
    $dateff[] = $adata[2];
  }
}
54K
07 июня 2010 года
lousx
24 / / 26.04.2010
verybadbug, почему-то ни один из примеров не рабоатет...
339
08 июня 2010 года
verybadbug
619 / / 12.09.2005
писал прямо в форум, возможны ошибки

эх... не хотите даже немного головой паработать (и поиском)
54K
08 июня 2010 года
lousx
24 / / 26.04.2010
verybadbug, прошу прощения. Времени очень мало, а с учетом того, что я не понимаю в php разбираться мне нужно очень и очень долго.
verybadbug, результат выполнения скрипта таков:
 
Код:
Array ( [0] => Array ( [0] => 25.12.2009 00:12 [1] => 21 [2] => 57 [3] => ) [1] => Array ( [0] => 25.12.2009 00:15 [1] => 01 [2] => 58 [3] => ) [2] => Array ( [0] => 25.12.2009 00:20 [1] => 44 [2] => 45 [3] => ) )


Необходимо, чтобы за выбранный период в 3 переменных записывалось: В $data1 - даты, в $data2 - значение, $data3 - значение. Могли бы так сделать?

А вообще классно... Спасибо Вам огромнейшее. Я, правда, в Вашем коде почти ничего не понимаю.
verybadbug, мне правдо очень стыдно, что я Вас терроризирую. Но просто не реально самому за такой короткий срок разобраться.

А поиском мы работаем...
339
08 июня 2010 года
verybadbug
619 / / 12.09.2005
вместо
 
Код:
if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
      $data[] = $adata;
    }

пишем
 
Код:
if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
      $data1[] = $adata[0];
      $data2[] = $adata[1];
      $data3[] = $adata[2];
    }



тот результат, что вы указали в предыдущем посте - вывод переменной (print_r($data)). замените этот вывод на то, что необходимо вам
54K
08 июня 2010 года
lousx
24 / / 26.04.2010
Проблема вот в чём. На основе данных из этих массивов я вывожу график. График вывести не могу - ругается на то что заголовок уже был отправлен. Где-то слышал, что это из-за того, что скрипт выводит рисунок. Т.е.вывести списки выбора дат и рисунок одновременно я не могу. Передать значение сессией я не смог - та же ошибка. Что делать в такой ситуации?
244
08 июня 2010 года
UAS
2.0K / / 19.07.2006
Вывод заголовков должен происходить до вывода любого конента.
Вы явно выводите html, а потом уже отправляете заголовки, что и влечет ошибку.
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
при выводе рисунка html нужно полностью убрать
если есть необходимость отображать рисунок в документе html - добавляем в приложение обработчик изображения ОТДЕЛЬНЫМ ФАЙЛОМ
Код:
//=====где-то на странице=====
...
<img src="image.php?mydata[0]=a&mydata[1]=b&mydata[2]=c">
...

//=====в файле image.php=====
$mydata = $_GET["mydata"]; //читаем массив из параметров запроса
// пример из мануала
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);

imagejpeg($im);

// Free up memory
imagedestroy($im);
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
В index.php вписал:

 
Код:
<img src="work.php?datexx=data1&date=data2&dateff=data3">


В work.php:
 
Код:
$datexx = $_GET["datexx"];
$date = $_GET["date"];
$dateff = $_GET["dateff"];

Переменные пусты. Данные не передались.
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx
Переменные пусты. Данные не передались.


почему вы так решили?

приведите полный код work.php

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Код:
<?php
require_once ('jpgraph.php');
require_once ('jpgraph_line.php');

require_once ('jpgraph_scatter.php');
require_once ('jpgraph_regstat.php');



 

$datexx = $_GET["datexx"];
$date = $_GET["date"];
$dateff = $_GET["dateff"];






$timer = new JpgTimer();
$timer->Push();

// Create the graph. These two calls are always required
$graph = new Graph(800,500);
$graph->SetScale("textlin");

$graph->SetMargin(40,20,20,90);

$graph->title->Set("Timing a graph");
$graph->footer->right->Set('Timer (ms): ');
$graph->footer->right->SetFont(FF_COURIER,FS_ITALIC);
$graph->footer->SetTimer($timer);

// Create the linear plot
$lineplot=new LinePlot($date);

$lineplot2=new LinePlot($dateff);

// Add the plot to the graph
$graph->Add($lineplot);
$graph->Add($lineplot2);

$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");

$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);

$lineplot->SetColor("blue");
$lineplot->SetWeight(2);

$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);

$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();

//$datax = $gDateLocale->GetShortMonth();

$graph->xaxis->SetTickLabels($datexx);
$graph->xaxis->SetLabelAngle(90);
$graph->xaxis->SetLabelMargin(5);
$graph->xaxis->SetTextLabelInterval(3); //интервал через который показываются xaxis надписи
//$graph->xaxis->SetTextTickInterval(3,5); // интервал отметок axis



// Display the graph
$graph->Stroke();
?>

print_r ($datexx );
ничего не выводит

Делаю с фреймами, показалось проще.
Если это не так, можно и без них
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
После обращения из браузера, скрипт может сформировать данные ТОЛЬКО ОДНОГО!!! типа. Для фрейма нужен "text/html", для изображения "image/jpeg", "image/png".. или любой другой, в зависимости от данных, которые отправляются клиенту в браузер.

Если work.php - это фрейм, то использовать $graph->Stroke(); бессмысленно!

Если work.php - это изображение, для проверки в самом начале пишем print_r($_GET);die();, в адресной строке браузера пишем ваш_сайт/work.php?datexx=data1&dare=data2&datett=data3

что видим???
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Цитата:
Если work.php - это изображение, для проверки в самом начале пишем print_r($_GET);die();, в адресной строке браузера пишем http://ваш_сайт/work.php?datexx=data...2&datett=data3


Видим

Цитата:
Array ( [datexx] => data1 [date] => data2 [dateff] => data3 )



Но ведь чтобы массивы записались в datexx, date и dateff необходимо сначала выполнить index.php, правильно я понимаю?

339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
сейчас мы занимаемся отладкой вашего графика...

убираем print_r($_GET);die();
в конце убираем $graph->Stroke();

проверяем тотже адрес...

ошибки выдает?
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Ошибок нет. Пустая страница
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
если нет ошибок, в конце добавляем то, что было раньше ($graph->Stroke();)

проверяем адрес...
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Ошибка JPgraph:
Не возможно определить мин и мах значения по оси Y.
Тольно null значения.

Судя по всему это потому, что массивы datexx, date и dateff пусты.

Само собой они пусты так как они формируются в index.php
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
меняем запрос на
?datexx[0]=1&datexx[1]=2&date[0]=3&date[1]=4&datett[0]=5&datett[1]=6
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Работает. Вывелся график.
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
вопрос на засыпку: зачем вам фреймы?

если будем обходиться без них, то в index.php пишем в конце (для проверки)
 
Код:
<img src="work.php?datexx[0]=1&datexx[1]=2&date[0]=3&date[1]=4&datett[0]=5&datett[1]=6">


если график вывелся - то осталось сгенерить тег img в соответствии с запросом пользователя
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Незачем они мне.
Фреймами воспользовался, когда встала проблема одновременного отображения texarea с кнопкой и вывода самого графика. Отправлял данные GETом, потом скрипт отбирал данные и рисовал график.

Цитата:
если график вывелся - то осталось сгенерить тег img в соответствии с запросом пользователя



График вывелся

Так значений то будет не 2 и не 5, а сотни. Получается будет неимоверной длинны url?

<img src="work.php?datexx=data1&date=data2&dateff=data3">
Почему-то не работает

339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx
Так значений то будет не 2 и не 5, а сотни.


передавайте параметрами не массивы, а даты (необходимые вычисления делаем не в index.php, а в work.php)

Цитата: lousx
<img src="work.php?datexx=data1&date=data2&dateff=data3">
Почему-то не работает


передаются не массивы, а строки

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
т.е. в index.php делаем выбор дат и отправляем их (например GETом) в work.php, где будет выполняться следующий код:
Код:
$start_date = "{$s_start_day}.{$s_start_month}";
  $end_date = "{$s_end_day}.{$s_end_month}";
  $do_add = ($start) ? false : true; //флаг добавления
  $contents = file_get_contents("test.csv"); //читаем csv как текст
  $items = explode("\n", str_replace("\r", "", $contents)); //преобразуем текст в массив строк
  $data = array();
   
 
  foreach ($items as $value) { //работаем построчно (для каждой строки)
    $adata = str_getcsv($value); //парсим csv
    if (!$do_add) { $do_add = substr($adata[0], 0, 5) == $start_date; } //при снятом флаге: если строка соответствует первой дате - устанавливаем флаг
    if ($do_add) {
      $do_add = substr($adata[0], 0, 5) != $end_date; //при установленном флаге: если строка соответствует второй дате - снимаем флаг
      if (!$do_add) { break; }
    }
       if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
      $data1[] = $adata[0];
      $data2[] = $adata[1];
      $data3[] = $adata[2];
    }
     
     
     
     

     
     
     
    }
  }
  unset($items);
  unset($contents);

а далее использовать массивы data1 data2 data3. Правильно я Вас понял?

Цитата:
передаются не массивы, а строки


Почему же тогда, написав <?php print_r ($data2); ?> выводится массив?

339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx
Правильно я Вас понял?


ага

Цитата: lousx
Почему же тогда, написав <?php print_r ($data2); ?> выводится массив?



не путайте html и php

чтобы массив из php ($data) передать в html, необходимо проделать некоторые манипуляции, чтобы в выводе получилось чё-то типа data[0]=a&data[1]=b...

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Цитата:
чтобы массив из php ($data) передать в html, необходимо проделать некоторые манипуляции, чтобы в выводе получилось чё-то типа data[0]=a&data[1]=b...


Мне это нужно делать?

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
index.php
Цитата:
<?
require_once("str_getcsv.php"); //для php < 5.3
require_once ('jpgraph.php');
require_once ('jpgraph_line.php');

require_once ('jpgraph_scatter.php');
require_once ('jpgraph_regstat.php');

//функции для построения списков
function day_options($current) {
$r = "";
for ($i = 1; $i <= 31; $i++) {
$s = $i == $current ? " selected" : "";
$r .= "<option value=\"{$i}\"{$s}>{$i}</option>";
}
return $r;
}
function month_options($current) {
$month_names = array("Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек");
$r = "";
for ($i = 1; $i <= 12; $i++) {
$s = $i == $current ? " selected" : "";
$r .= "<option value=\"{$i}\"{$s}>" . $month_names[$i - 1] . "</option>";
}
return $r;
}
function year_options($current) {
$r = "";
$year = date("Y");
for ($i = 0; $i <= 5; $i++) {
$y = $year - $i;
$s = $y == $current ? " selected" : "";
$r .= "<option value=\"{$y}\"{$s}>{$y}</option>";
}
return $r;
}
//читаем параметры
$start_day = 0 + (array_key_exists("start_day", $_GET) ? $_GET["start_day"] : 0);
$start_month = 0 + (array_key_exists("start_month", $_GET) ? $_GET["start_month"] : 0);
$start_year = 0 + (array_key_exists("start_year", $_GET) ? $_GET["start_year"] : 0);
$end_day = 0 + (array_key_exists("end_day", $_GET) ? $_GET["end_day"] : 0);
$end_month = 0 + (array_key_exists("end_month", $_GET) ? $_GET["end_month"] : 0);
$end_year = 0 + (array_key_exists("end_year", $_GET) ? $_GET["end_year"] : 0);

//определяем необходимость обработки данных
$start = $start_day && $start_month && $start_year;
$end = $end_day && $end_month && $end_year;

//необходимая обработка данных
$page_content = "";
if ($start || $end) {
//день и масяц - двузначные числа
$s_start_day = "" . $start_day; while (strlen($s_start_day) < 2) { $s_start_day = "0{$s_start_day}"; }
$s_start_month = "" . $start_month; while (strlen($s_start_month) < 2) { $s_start_month = "0{$s_start_month}"; }
$s_end_day = "" . $end_day; while (strlen($s_end_day) < 2) { $s_end_day = "0{$s_end_day}"; }
$s_end_month = "" . $end_month; while (strlen($s_end_month) < 2) { $s_end_month = "0{$s_end_month}"; }
//выводим начало и конец
if ($start) { $page_content .= "Начало: {$s_start_day}.{$s_start_month}.{$start_year}<br />"; }
if ($end) { $page_content .= "Конец: {$s_end_day}.{$s_end_month}.{$end_year}<br />"; }






}
unset($items);
unset($contents);




?>


<form action = "work.php" method = "GET">
<select name="start_day"><option></option><? print(day_options($start_day)) ?></select>
<select name="start_month"><option></option><? print(month_options($start_month)) ?></select>
<select name="start_year"><option></option><? print(year_options($start_year)) ?></select> <br />
<select name="end_day"><option></option><? print(day_options($end_day)) ?></select>
<select name="end_month"><option></option><? print(month_options($end_month)) ?></select>
<select name="end_year"><option></option><? print(year_options($end_year)) ?></select> <br />
<input type="submit" />
</form>


<? if ($page_content != "") { print($page_content); } ?>



work.php:

Цитата:
<?php
require_once ('jpgraph.php');
require_once ('jpgraph_line.php');

require_once ('jpgraph_scatter.php');
require_once ('jpgraph_regstat.php');
require_once("str_getcsv.php"); //для php < 5.3



$start_day = $_GET["start_day"];
$start_month = $_GET["start_month"];
$start_year = $_GET["start_year"];
$end_day = $_GET["end_day"];
$end_month = $_GET["end_month"];
$end_year = $_GET["end_year"];

//обработка данных
$start_date = "{$s_start_day}.{$s_start_month}";
$end_date = "{$s_end_day}.{$s_end_month}";
$do_add = ($start) ? false : true; //флаг добавления
$contents = file_get_contents("test.csv"); //читаем csv как текст
$items = explode("\n", str_replace("\r", "", $contents)); //преобразуем текст в массив строк
$data = array();


foreach ($items as $value) { //работаем построчно (для каждой строки)
$adata = str_getcsv($value); //парсим csv
if (!$do_add) { $do_add = substr($adata[0], 0, 5) == $start_date; } //при снятом флаге: если строка соответствует первой дате - устанавливаем флаг
if ($do_add) {
$do_add = substr($adata[0], 0, 5) != $end_date; //при установленном флаге: если строка соответствует второй дате - снимаем флаг
if (!$do_add) { break; }
}
if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
$data1[] = $adata[0];
$data2[] = $adata[1];
$data3[] = $adata[2];
}


}


$timer = new JpgTimer();
$timer->Push();

// Create the graph. These two calls are always required
$graph = new Graph(800,500);
$graph->SetScale("textlin");

$graph->SetMargin(40,20,20,150);

$graph->title->Set("Timing a graph");
$graph->footer->right->Set('Timer (ms): ');
$graph->footer->right->SetFont(FF_COURIER,FS_ITALIC);
$graph->footer->SetTimer($timer);

// Create the linear plot
$lineplot=new LinePlot($data2);

$lineplot2=new LinePlot($data3);

// Add the plot to the graph
$graph->Add($lineplot);
$graph->Add($lineplot2);

$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");

$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);

$lineplot->SetColor("blue");
$lineplot->SetWeight(2);

$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);

$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();

//$datax = $gDateLocale->GetShortMonth();

$graph->xaxis->SetTickLabels($data1);
$graph->xaxis->SetLabelAngle(90);
$graph->xaxis->SetLabelMargin(5);
$graph->xaxis->SetTextLabelInterval(3); //интервал через который показываются xaxis надписи
//$graph->xaxis->SetTextTickInterval(3,5); // интервал отметок axis



// Display the graph
$graph->Stroke();
?>



Выводит график на основе всех данных. Т.е. отбор по данным не происходит.
И выводится график на другой странице

339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
если все вычисления будут проводиться в work.php - то нет
54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Вычисления проводятся в work.php. Результат:
Цитата:
Выводит график на основе всех данных. Т.е. отбор по данным не происходит.
И выводится график на другой странице


[SIZE="1"][COLOR="Silver"]verybadbug, у меня надежда только на Вас, пожалуйста, помогите. Осталось, как мне кажется совсем ничего.
С меня коньяк, или пиво. В общем как пожелаете.[/COLOR][/SIZE]

339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
index.php
Код:
<?
//функции для построения списков
function day_options($current) {
  $r = "";
  for ($i = 1; $i <= 31; $i++) {
    $s = $i == $current ? " selected" : "";
    $r .= "<option value=\"{$i}\"{$s}>{$i}</option>";
  }
  return $r;
}
function month_options($current) {
  $month_names = array("Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек");
  $r = "";
  for ($i = 1; $i <= 12; $i++) {
    $s = $i == $current ? " selected" : "";
    $r .= "<option value=\"{$i}\"{$s}>" . $month_names[$i - 1] . "</option>";
  }
  return $r;
}
function year_options($current) {
  $r = "";
  $year = date("Y");
  for ($i = 0; $i <= 5; $i++) {
    $y = $year - $i;
    $s = $y == $current ? " selected" : "";
    $r .= "<option value=\"{$y}\"{$s}>{$y}</option>";
  }
  return $r;
}
//читаем параметры
$start_day = 0 + (array_key_exists("start_day", $_GET) ? $_GET["start_day"] : 0);
$start_month = 0 + (array_key_exists("start_month", $_GET) ? $_GET["start_month"] : 0);
$start_year = 0 + (array_key_exists("start_year", $_GET) ? $_GET["start_year"] : 0);
$end_day = 0 + (array_key_exists("end_day", $_GET) ? $_GET["end_day"] : 0);
$end_month = 0 + (array_key_exists("end_month", $_GET) ? $_GET["end_month"] : 0);
$end_year = 0 + (array_key_exists("end_year", $_GET) ? $_GET["end_year"] : 0);

//определяем необходимость обработки данных
$start = $start_day && $start_month && $start_year;
$end = $end_day && $end_month && $end_year;

//необходимая обработка данных
$page_content = "";
if ($start || $end) {
  //день и масяц - двузначные числа
  $s_start_day = "" . $start_day; while (strlen($s_start_day) < 2) { $s_start_day = "0{$s_start_day}"; }
  $s_start_month = "" . $start_month; while (strlen($s_start_month) < 2) { $s_start_month = "0{$s_start_month}"; }
  $s_end_day = "" . $end_day; while (strlen($s_end_day) < 2) { $s_end_day = "0{$s_end_day}"; }
  $s_end_month = "" . $end_month; while (strlen($s_end_month) < 2) { $s_end_month = "0{$s_end_month}"; }
  //выводим начало и конец
  if ($start) { $page_content .= "Начало: {$s_start_day}.{$s_start_month}.{$start_year}<br />"; }
  if ($end) { $page_content .= "Конец: {$s_end_day}.{$s_end_month}.{$end_year}<br />"; }
  //выводим график
  $s = "";
  if ($start) { $s .= "start=" . mktime(0, 0, 0, $start_month, $start_day, $start_year) . "&"; }
  if ($end) { $s .= "end=" . mktime(0, 0, 0, $end_month, $end_day, $end_year) . "&"; }
  $s = substr($s, 0, -1);
  $page_content .= "<img src=\"work.php?{$s}\" /><br />";
}
unset($items);
unset($contents);




?>


<form>
<select name="start_day"><option></option><? print(day_options($start_day)) ?></select>
<select name="start_month"><option></option><? print(month_options($start_month)) ?></select>
<select name="start_year"><option></option><? print(year_options($start_year)) ?></select> <br />
<select name="end_day"><option></option><? print(day_options($end_day)) ?></select>
<select name="end_month"><option></option><? print(month_options($end_month)) ?></select>
<select name="end_year"><option></option><? print(year_options($end_year)) ?></select> <br />
<input type="submit" />
</form>


<? if ($page_content != "") { print($page_content); } ?>


work.php
Код:
<?php
require_once("str_getcsv.php"); //для php < 5.3

$start = array_key_exists("start", $_GET) ? $_GET["start"] : 0;
$end = array_key_exists("end", $_GET) ? $_GET["end"] : 0;

//обработка данных
$start_date = date("d.m", $start);
$end_date = date("d.m", $end);
$do_add = ($start) ? false : true; //флаг добавления
$contents = file_get_contents("test.csv"); //читаем csv как текст
$items = explode("\n", str_replace("\r", "", $contents)); //преобразуем текст в массив строк
$data = array();

foreach ($items as $value) { //работаем построчно (для каждой строки)
  $adata = str_getcsv($value); //парсим csv
  if (!$do_add) { $do_add = substr($adata[0], 0, 5) == $start_date; } //при снятом флаге: если строка соответствует первой дате - устанавливаем флаг
  if ($do_add) {
    $do_add = substr($adata[0], 0, 5) != $end_date; //при установленном флаге: если строка соответствует второй дате - снимаем флаг
    if (!$do_add) { break; }
  }
  if ($do_add) { //если флаг установлен - добавляем данные из текущей строки
    $data1[] = $adata[0];
    $data2[] = $adata[1];
    $data3[] = $adata[2];
  }
}




require_once ('jpgraph.php');
require_once ('jpgraph_line.php');

require_once ('jpgraph_scatter.php');
require_once ('jpgraph_regstat.php');

$timer = new JpgTimer();
$timer->Push();

// Create the graph. These two calls are always required
$graph = new Graph(800,500);
$graph->SetScale("textlin");

$graph->SetMargin(40,20,20,150);

$graph->title->Set("Timing a graph");
$graph->footer->right->Set('Timer (ms): ');
$graph->footer->right->SetFont(FF_COURIER,FS_ITALIC);
$graph->footer->SetTimer($timer);

// Create the linear plot
$lineplot=new LinePlot($data2);

$lineplot2=new LinePlot($data3);

// Add the plot to the graph
$graph->Add($lineplot);
$graph->Add($lineplot2);

$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");

$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);

$lineplot->SetColor("blue");
$lineplot->SetWeight(2);

$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);

$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();

//$datax = $gDateLocale->GetShortMonth();

$graph->xaxis->SetTickLabels($data1);
$graph->xaxis->SetLabelAngle(90);
$graph->xaxis->SetLabelMargin(5);
$graph->xaxis->SetTextLabelInterval(3); //интервал через который показываются xaxis надписи
//$graph->xaxis->SetTextTickInterval(3,5); // интервал отметок axis



// Display the graph
$graph->Stroke();
?>


Цитата: lousx
[SIZE="1"][COLOR="Silver"]С меня коньяк, или пиво. В общем как пожелаете.[/COLOR][/SIZE]



ну если ради этого вы готовы приехать в Хабаровск - то без проблем :)

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
Тоже самое. Выводит график за все даты и на новой странице.
Благо - чтобы угостить сейчас совсем не обязательно приезжать =)
339
09 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: lousx
Тоже самое. Выводит график за все даты и на новой странице.



копи-паст того, что я скинул выше (index.php)
у меня всё происходит на одной странице

54K
09 июня 2010 года
lousx
24 / / 26.04.2010
verybadbug, Я ЛЮБЛЮ ВАС! С меня коньяк. Но чуть позже, как завершу это дело. Числа 15-18.
Есть еще один момент. Можно сделать, если не указаны даты, график выводился за все даты?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог