Alick
15:13 14-03-2003 Вопросик к знатокам PHP
Дано: есть текстовый файл, разбирый тэгом <!--New notice--> на заметки.
Вопрос: как наиболее оптимально считывать оттуда заметки?
Грубо говоря, нужна функция, на вход к которой подается указатель на файл, номер первой заметки и последней (допустим с третьей по десятую), на выходе она должна дать массив строковых переменных, содержащий в каждой такой переменной по заметке.
Комментарии:
Inline
16:50 14-03-2003
Хм, если бы речь шла о перле, то я бы сделал split, а потом splice. Как-нибудь так:

sub x
{
my $fl = shift;
my $from = shift;
my $to = shift;

open(FL,"<$fl") or die("p1");
my $lines = join('',<FL> );
close FL;

my @parts = split(/<\!\-\-New\snotice\-\->/,$lines);

return splice(@parts,$from,$to-$from);
}

my @ar = x("m3.txt",1,3);
print @ar;

Но ведь речь о PHP
Alick
16:57 14-03-2003
У меня все это выглядит так:

function read_notice($file,$first_notice,$last_notice)
{
$rez_notices=array();
for($i=1;!feof($file) and $i<=$first_notice-1
{
$notice=fgets($file);
if(strstr($notice,"End of notice"))
{
$i++;
}
}
for($i=1;!feof($file) and $i+$first_notice<=$last_notice+1
{
$notice=fgets($file);
if(strstr($notice,"End of notice"))
{
$i++;
}
else
{
$rez_notices[$i].=$notice;
$rez_notices[$i].="<br>";
}
}
return $rez_notices;
}

иными словами, считывание по строкам. Печенкой чую, что лучше сделать можно.
У этой фунции большой недостаток - если очень большой файл и большое количество записей, то она работает долго. (у меня меговый архив и функция долго выводит записи в диапазоне от 3010 по 3020-ю) :-)
Inline
17:04 14-03-2003
Лучше тогда, по возможности, хранить где-то таблицу из адресов записей (массив "начало-конец"). Так быстрее всего будет. Понятно, да - чтобы не делать одно и тоже каждый раз.
Alick
17:07 14-03-2003
Inline, идея хорошая.
Alick
17:10 14-03-2003
Тогда можно не заморачиваться с добавлением записей в начало архива. Спокойно писать в конец и дописывать в индекс (файл с адресами) новый адрес заметки.
Inline
17:11 14-03-2003
Да, т.к. если критична скорость, то то, что я написал на перле так же будет работать долго, если файл большой (и если он plain text).
Alick
17:17 14-03-2003
Inline, плайн текст.
Кстати, может знаешь, как реализовать простенький архиватор? Просто места у хостера мало выдается :-(
gzipa - нету.
Inline
17:20 14-03-2003
Как это gzip-а нет? Чего там вообще есть?
Вообще, зачем он тебе?
Alick
17:26 14-03-2003
Inline, есть только парсер пхп и перла. никаких доп. модулей - нету.
Зачем... ну как зачем - место экономить. на 15-ти мегах не особенно разживешься.
Inline
17:28 14-03-2003
Архивирование скорости не прибавит.
Такие вещи делаются только на SQL...
Alick
17:32 14-03-2003
Inline, ясен пень, что не прибавит. Тут уже другая штука. Да я и не расчитываю на большой наплыв посетителей. Просто пхп изучаю.
Alick
17:33 14-03-2003
Inline SQL там тоже нету... точнее есть, но не для бесплатных юзеров.
Inline
17:35 14-03-2003
Можно еще - для ускорения работы - записывать каждую запись в одну строчку. Кодируя переносы сразу как <br> и т.п. А в отдельный файл заносить адреса этих строк. Дальше понятно...
Alick
17:41 14-03-2003
Inline, до этого я сам допер. Хотя, на размер файла это скажется в худшую сторону - все-таки \n и <br> занимаемом месте различаются в два раза :-)
Но читаться, будет быстрее.
Inline
17:50 14-03-2003
Это всегда так. Либо скорость, либо объем.
Как это называется... палка о двух концах?
Inline
17:50 14-03-2003
Экономь на переносах
Alick
17:53 14-03-2003
Inline, это все задача для оффлайн клиента. Будем думать.