Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чтение из файлов
 
 автор: mrklon   (27.10.2006 в 22:40)   письмо автору
 
 

Вопрос: есть файл в 30 строк. Как прочитать с 10 до 15 строку, нетрогая остальные?
...вы не против, если я буду и дальше задавать сдесь свои вопросы?

   
 
 автор: kasmanaft   (27.10.2006 в 22:54)   письмо автору
 
   для: mrklon   (27.10.2006 в 22:40)
 

Прочитать начиная с 10-й строки не получится ... нужно просто пропустить первые 9 строк. (используя fgets)
Используя ф-ю file, получим массив, где элементами будут строки из файла... Не нужные можно потом unset
http://softtime.ru/forum/read.php?id_forum=1&id_theme=21442&page=1

   
 
 автор: mrklon   (27.10.2006 в 23:01)   письмо автору
 
   для: kasmanaft   (27.10.2006 в 22:54)
 

То есть, если нужно прочитать 31 строчку, то придеться читать и все 30? На сколько тормознуто это будет при больших файлах (ориентировачно 1`000кб)

   
 
 автор: cheops   (27.10.2006 в 23:03)   письмо автору
 
   для: mrklon   (27.10.2006 в 23:01)
 

Это происходит, как правило, очень быстро, файл в 1-10 Мб - это не много по меркам PHP.

   
 
 автор: cheops   (27.10.2006 в 22:55)   письмо автору
 
   для: mrklon   (27.10.2006 в 22:40)
 

Совсем не трогая не получится. Файл не большой, поэтому его содержимое можно прочитать в массив при помощи функции file(), а потом прочитать содержмое массива с 10 по 15 элемент
<?php
  $arr 
file("text.txt");
  
// На единицу меньше, так как индексы в массиве начинаются с нуля
  
for($i 9$i 14$i++) echo $arr[$i]."<br>";
?>


>...вы не против, если я буду и дальше задавать сдесь свои вопросы?
Все будут только за, форум для того и предназначен, чтобы вы могли задать здесь свой вопрос и получить ответ (максимум что вам грозит - никто не ответит, если не знает ответа или ленится отвечать :).

   
 
 автор: mrklon   (28.10.2006 в 17:40)   письмо автору
 
   для: cheops   (27.10.2006 в 22:55)
 

Тогда слежующий вопрос:
как кучку репласов:
$vivod=preg_replace("/{{nik}}/", $nik[$n+$i],$msg);
$vivod2=preg_replace("/{{mail}}/", $mail[$n+$i],$vivod);
$vivod3=preg_replace("/{{web}}/", $web[$n+$i],$vivod2);
$vivod4=preg_replace("/{{msg}}/", $mmm[$n+$i],$vivod3);

свести к одному preg_replace

   
 
 автор: mrklon   (28.10.2006 в 20:22)   письмо автору
 
   для: mrklon   (28.10.2006 в 17:40)
 

Никто незнает как чгрупироват замены? Или это нельзя сделать? :(
Нужно сделать такую вещ:
$c = $a / $b
Нужно, чтоб, если они деляться без остатка, ответ осталься бы тот-же, а, если с остатком, то нужен ответ без остатка плюс еденица

Пример:
50/5 равно 10
50/6 равно 9 а не 8,3

   
 
 автор: ЯR   (28.10.2006 в 20:48)   письмо автору
 
   для: mrklon   (28.10.2006 в 17:40)
 

попробуй так:

$vivod=preg_replace("/{{([a-z]+)}}/e", '\$\1[\$n+\$i]',$msg);

   
 
 автор: mrklon   (28.10.2006 в 23:11)   письмо автору
 
   для: ЯR   (28.10.2006 в 20:48)
 

Хитро! Недодумался! Спасибо!
А вот про такое скажите что нить?

50/5 равно 10
50/6 равно 9 а не 8,3

   
 
 автор: ЯR   (28.10.2006 в 23:39)   письмо автору
 
   для: mrklon   (28.10.2006 в 23:11)
 


$c = ceil($a/$b);

   
 
 автор: mrklon   (29.10.2006 в 08:55)   письмо автору
 
   для: ЯR   (28.10.2006 в 23:39)
 

Сенкс! За помощью ЯR написал вот такой "постраничный вывод":



<?

$i
=0;

$clinks=4// skolko ssilok pokazivat

$k=5//pokazivat po *
$v=50//vsego strok
$vk=ceil($v/$k); //vsego stranits


$page $HTTP_GET_VARS["cnt"];
$page=$page-1;

#----------------------------------------------------------------------------------

if ($v>$k// проверяем нужность этой навигации

if($page+1>1){    echo "<a href=index.php?cnt=1>&nbsp;&lt;&lt;&nbsp;</a>";} // Если страница не первая, то выводм ссылку на 1 страницу
if($page+1>1){    echo "<a href=index.php?cnt=",$page+1-1,">&nbsp;&lt;&nbsp;</a>";} // Если страница не первая, то вывожим ссылку на предыдущую страницу

for($i=0;($page+1)-($clinks/2)+$i <= ($page+1)+($clinks/2) ;$i++) //малюем цикл создания 2 ссылок ДО, и 2 ссылок ПОСЛЕ страници
    
{
        if((
$page+1)-($clinks/2)+$i != $page+1)//Проверяем несовпадения страници со ссылками
        
{

            if((
$page+1)-($clinks/2)+$i and ($page+1)-($clinks/2)+$i <= $vk)
            {echo 
"<a href=index.php?cnt=",($page+1)-($clinks/2)+$i,">",($page+1)-($clinks/2)+$i,"</a>";}//Отрезаем несуществующие крайние ссылки
        
}
        else
        {
            echo 
"<b>&nbsp;&nbsp;",($page+1),"&nbsp;&nbsp;</b>"//Вывлдим номер страници
        
}
    }

if(
$page+1<=$vk-1){    echo "<a href=index.php?cnt=",$page+1+1,">&nbsp;&gt;&nbsp;</a>";}//Если страница не последняя то выводм ссылку на след. страницу
if($page+1<=$vk-1){    echo "<a href=index.php?cnt=",$vk,">&nbsp;&gt;&gt;&nbsp;</a>";}//Если страница не помледняя, то выводм ссылку на последн. страницу

}

#-----------------------------------------------------------------------------------



# dalse kod vivods kontenta...



?>



А вот что на выходе:
<< < 67 8 910 > >>

Господа проффесирналы! Может что коряво написано? Или моэно упростить?

   
 
 автор: ЯR   (29.10.2006 в 09:21)   письмо автору
 
   для: mrklon   (29.10.2006 в 08:55)
 

по-моему лучше так:

<?  

$i
=0;

$clinks=4// skolko ssilok pokazivat

$k=5//pokazivat po *
$v=50//vsego strok
$vk=ceil($v/$k); //vsego stranits


$page = (int)$HTTP_GET_VARS["cnt"];
if (
$page 1$page 1;


#----------------------------------------------------------------------------------

if ($v>$k){ // проверяем нужность этой навигации

if($page+1>1){
    echo 
"<a href=index.php?cnt=1>&nbsp;&lt;&lt;&nbsp;</a>"// Если страница не первая, то выводм ссылку на 1 страницу
    
echo "<a href=index.php?cnt=",$page-1,">&nbsp;&lt;&nbsp;</a>"// Если страница не первая, то вывожим ссылку на предыдущую страницу
}

for(
$i=0$i-($clinks/2) <= ($clinks/2) ;$i++) //малюем цикл создания 2 ссылок ДО, и 2 ссылок ПОСЛЕ страници
{
    if(
$i-($clinks/2) != 0)//Проверяем несовпадения страници со ссылками
    
{

        if(
$page-($clinks/2)+$i and $page-($clinks/2)+$i <= $vk)
        {echo 
"<a href=index.php?cnt=",$page-($clinks/2)+$i,">",$page-($clinks/2)+$i,"</a>";}//Отрезаем несуществующие крайние ссылки
    
}
    else
    {
        echo 
"<b>&nbsp;&nbsp;",$page,"&nbsp;&nbsp;</b>"//Выводим номер страници
    
}
}

if(
$page<=$vk-1){
    echo 
"<a href=index.php?cnt=",$page+1,">&nbsp;&gt;&nbsp;</a>";//Если страница не последняя то выводм ссылку на след. страницу
    
echo "<a href=index.php?cnt=",$vk,">&nbsp;&gt;&gt;&nbsp;</a>";//Если страница не последняя, то выводм ссылку на последн. страницу
}
}


$page=$page-1;

#-----------------------------------------------------------------------------------



# dalse kod vivods kontenta...



?>

   
 
 автор: mrklon   (29.10.2006 в 23:39)   письмо автору
 
   для: ЯR   (29.10.2006 в 09:21)
 

Спасибо еще раз.
Хочу возвратиться к свой базе данных. А может проще хранит каждое сообщение гостевой книги отдельным файлом. Тогда, по идеи, можно будет прочитать с 10 по 15 файл. И удалить так же...

   
 
 автор: ЯR   (30.10.2006 в 06:43)   письмо автору
 
   для: mrklon   (29.10.2006 в 23:39)
 

Можно и так, но при очень большом кол-ве файлов будет тормозить.

   
 
 автор: mrklon   (31.10.2006 в 23:43)   письмо автору
 
   для: ЯR   (30.10.2006 в 06:43)
 

ЯR: Можно и так, но при очень большом кол-ве файлов будет тормозить.

Но, я думаю прочитать 10 файлов из 200 проще, чем открывать файл в 200 строк и читать оттуда 10 строк...
Я верю что readdir() быстрее fgets()...
--------------------------------------------
Немогу понять асипку!



<?

$i
=0;

$clinks=6// skolko ssilok pokazivat

$k=3//pokazivat po *
$v=15//vsego strok
$vk=ceil($v/$k); //vsego stranits



$page $HTTP_GET_VARS["cnt"];
$page=$page-1;



######################################


$db_open=opendir("./db");

for(
$i=-2$i $page*$k+$k ;$i++)
    {
        
$db_read[$i]=readdir($db_open);
        if (
$db_read[$i]!="." and $db_read[$i]!=".." and ($page*$k <= $i))
        {
            
$db_msg_open[$i]=fopen("db/".$db_read[$i],"r");
            
$db_msg_read[$i]=fgets($db_msg_open[$i],1000);

            list(
$nik[$i],$mail[$i],$web[$i],$msg[$i],$data[$i],$otvet[$i])=explode("|",$db_msg_read[$i]); // ----- 69 stroka ----
            
$vivod1=preg_replace("/{{nik}}/",$nik[$i],$msg_tmpl);
            echo 
$vivod1;
            
fclose($db_msg_open[$i]);
        }
           else
           {
            unset(
$db_read[$i]);
        }
    }

?>



Выводит:
Notice: Undefined offset: 5 in x:\home\localhost\www\index.php on line 69

Notice: Undefined offset: 4 in x:\home\localhost\www\index.php on line 69

Notice: Undefined offset: 3 in x:\home\localhost\www\index.php on line 69

Notice: Undefined offset: 2 in x:\home\localhost\www\index.php on line 69

Notice: Undefined offset: 1 in x:\home\localhost\www\index.php on line 69

   
 
 автор: Trianon   (01.11.2006 в 00:06)   письмо автору
 
   для: mrklon   (31.10.2006 в 23:43)
 

>Но, я думаю прочитать 10 файлов из 200 проще, чем открывать файл в 200 строк и читать оттуда 10 строк...

Совершенно безосновательное предположение.

>Я верю что readdir() быстрее fgets()...

readdir сама по себе файл не читает.
а readdir+file будет медленнее fgets

   
 
 автор: ЯR   (01.11.2006 в 11:26)   письмо автору
 
   для: Trianon   (01.11.2006 в 00:06)
 

делай как тебе удобнее.
Думаю, большой разницы нет.

   
 
 автор: ЯR   (01.11.2006 в 11:28)   письмо автору
 
   для: mrklon   (31.10.2006 в 23:43)
 

Так тут вроде всего около 40 строк :-)

   
 
 автор: mrklon   (01.11.2006 в 22:48)   письмо автору
 
   для: ЯR   (01.11.2006 в 11:28)
 

Так я привел не весь код, Ту часть что 100% работает - я заменил на "############" Да я же отметил: какая строка 69-ая.

Вот все целиком:



<a href="forms.php" target="_blank">FORMS</a><hr><hr>
<?

$i
=0;

$clinks=6// skolko ssilok pokazivat

$k=3//pokazivat po *
$v=15//vsego strok
$vk=ceil($v/$k); //vsego stranits



$page $HTTP_GET_VARS["cnt"];
if (empty(
$page))
    {
        
$page=1;
    }
$page=$page-1;

#----------------------------------------------------------------------------------

if ($v>$k){

if(
$page+1>1){    echo "<a href=index.php?cnt=1>&nbsp;&lt;&lt;&nbsp;</a>";}
if(
$page+1>1){    echo "<a href=index.php?cnt=",$page+1-1,">&nbsp;&lt;&nbsp;</a>";}

for(
$i=0;($page+1)-($clinks/2)+$i <= ($page+1)+($clinks/2) ;$i++)
    {
        if((
$page+1)-($clinks/2)+$i != $page+1)
        {

            if((
$page+1)-($clinks/2)+$i and ($page+1)-($clinks/2)+$i <= $vk)
            {echo 
"<a href=index.php?cnt=",($page+1)-($clinks/2)+$i,">",($page+1)-($clinks/2)+$i,"</a>";}
        }
        else
        {
            echo 
"<b>&nbsp;&nbsp;",($page+1),"&nbsp;&nbsp;</b>";
        }
    }

if(
$page+1<=$vk-1){    echo "<a href=index.php?cnt=",$page+1+1,">&nbsp;&gt;&nbsp;</a>";}
if(
$page+1<=$vk-1){    echo "<a href=index.php?cnt=",$vk,">&nbsp;&gt;&gt;&nbsp;</a>";}

}



echo(
"<hr>");
#----------------------------------------------------------------------------------

$msg_tmpl_open=fopen("tmpl/template.html","r");
$msg_tmpl_read=fread($msg_tmpl_open,10000);
list(
$shapka,$msg_tmpl,$niz)=explode("{{msg_template}}",$msg_tmpl_read);


#----------------------------------------------------------------------------------

$db_open=opendir("./db");

for(
$i=-2$i $page*$k+$k ;$i++)
    {
        
$db_read[$i]=readdir($db_open);
        if (
$db_read[$i]!="." and $db_read[$i]!=".." and ($page*$k <= $i))
        {
            
$db_msg_open[$i]=fopen("db/".$db_read[$i],"r");
            
$db_msg_read[$i]=fgets($db_msg_open[$i],1000);

            list(
$nik[$i],$mail[$i],$web[$i],$msg[$i],$data[$i],$otvet[$i])=explode("|",$db_msg_read[$i]);
            
$vivod1=preg_replace("/{{nik}}/",$nik[$i],$msg_tmpl);
            echo 
$vivod1;
            
fclose($db_msg_open[$i]);
        }
           else
           {
            unset(
$db_read[$i]);
        }
    }

?>

   
 
 автор: ЯR   (02.11.2006 в 04:20)   письмо автору
 
   для: mrklon   (01.11.2006 в 22:48)
 

а приведи пример print_r($db_msg_read) (что оно выдаёт?)

   
 
 автор: mrklon   (02.11.2006 в 11:14)   письмо автору
 
   для: ЯR   (02.11.2006 в 04:20)
 

Array ( [3] => [4] => [5] => )
Незнаю, что это может значить :-{|

   
 
 автор: ЯR   (02.11.2006 в 13:44)   письмо автору
 
   для: mrklon   (02.11.2006 в 11:14)
 

Значит у вас ничего из файла не прочиталось.
Поэтому и ошбики.
Может заменить

<?php
$db_msg_open
[$i]=fopen("db/".$db_read[$i],"r"); 
$db_msg_read[$i]=fgets($db_msg_open[$i],1000);
fclose($db_msg_open[$i]);
?>

на

<?php
$db_msg_read
[$i] = file_get_contents("db/".$db_read[$i]);
?>

Может так заработает

   
 
 автор: mrklon   (02.11.2006 в 17:32)   письмо автору
 
   для: ЯR   (02.11.2006 в 13:44)
 

Спасибо!
Вот новая задачка:
Если я открываю директорию, и "readdir"-ом читаю файлы, то он их выводит по такому принципу:

1.dat
10.dat
11.dat
12.dat
13.dat

-//-

19.dat
2.dat
21.dat
и т.д.

А нужно:
1.dat
2.dat
3.dat
4.dat

Я нехочу использовать сортировку массива, слишком дорого будет. Нельзя-ли заставить "readdir" Работать понормальному?

   
 
 автор: cheops   (02.11.2006 в 19:43)   письмо автору
 
   для: mrklon   (02.11.2006 в 17:32)
 

Без использования промежуточного массива не получится.

   
 
 автор: long123   (02.11.2006 в 22:57)   письмо автору
 
   для: cheops   (02.11.2006 в 19:43)
 

u menya poluchilos , stranno

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования