Изменение данных в файле в нужных строчках

DenVeroid

Новичок
Изменение данных в файле в нужных строчках

Подскажите как можно извенить несколько строчек или одну за раз из файла
тоесть вывожу весть файл через масив file() где выбераю нужный элемент checkbox, затем нажимаю на кнопку "Редактировать" где выводяться все данные которые выбрал галачками, они помещяются, но вот как сохранить изменённое???
делаю так

PHP:
if ($id_news_file != "")
{
//$id_news_file--;
$file=file("C:/server/www/ftp/news/2004/01/23/_index.htm");
$fp=fopen("C:/server/www/ftp/news/2004/01/23/_index.htm","w");
for($i=0;$i<sizeof($file);$i++)
{
if($i==$id_news_file)
{
//unset($file[$i]);
echo $file[$i]="";
$file[$i]= "$block_idx\r\n";
}
}
fputs($fp,implode("",$file));
fclose($fp);
}
пример взял где непомню, но, он расчитан на удаление строчки, сейчас пытаюсь изменить так чтобы можно было измениять данные.
переменная $id_news_file содержить ид строчки которуб нужно изменить, через цикл в котором находиться этот код
 

Silya

Guest
Записывай неудаленные строки в другой массив, а затем перезаписывай в файл
 

Demiurg

Guest
можно поподнобнее о том, что сейчас есть и чего не хватает ?
 

DenVeroid

Новичок
можно поподнобнее о том, что сейчас есть и чего не хватает ?
можно, сейчас вместо указанных строчек(элементов масива) сохраняет в самом вверху этого файла, а те строчки оставляет без изменения, совсем нетак как нужно
 

StUV

Rotaredom
DenVeroid
т.е. - ты хочешь
1. прочитать файл, выбрать из него определенные строки, удалить все из файла и записать в него выбранные строки ?
Или
2. изменить содержимое выбранных строк, оставив все остальное без изменений ?

напиши подробнее, что тебе надо, может быть и сам догонишь, как это сделать =)...
 

Altex

Новичок
DenVeroid
ссохранить тоже просто (у тебя же есть массив с измененными строками и их номерами) -
1) читаешь file() строчки все из файла
2) меняешь строки на нужные
3) записываешь обратно

или
1) читаешь file() строчки все из файла
3) записываешь обратно, прлверяя - если есть строка в новом массиве (с измененными строками) то берешь её от туда
 

Altex

Новичок
DenVeroid
PHP:
$aChangedLines - массив с измененными строками и с индексами номеров строк

if (!empty($aChangedLines)) 
{
    $file=file("C:/server/www/ftp/news/2004/01/23/_index.htm");
    if ($fp=fopen("C:/server/www/ftp/news/2004/01/23/_index.htm","w")) 
    {

        for($i=0, $cnt = count($file); $i<$c; $i++)
        {
            if (isset($aChangedLines[$i])) fputs($fp,$aChangedLines[$i]));
            else fputs($fp,$file[$i]));
        }
        fclose($fp);
    } else exit('error');
}
 

DenVeroid

Новичок
всем спасибо
Altex спасибо за код, просто я нестал его испробывать т.к уже сделал вот так


PHP:
<?
$line="1"; # строка, которую нужно изменить
$replace="ля ля ля"; # на что нужно изменить

$file=file("my_file.txt");
$open=fopen("my_file.txt","w");

   for($i=0;$i<count($file);$i++)
   {
      if(($i+1)!=$line){fwrite($open,$file[$i]);}
      else{fwrite($open,$replace."\r\n");}
   }

fclose($open); 
?>
 

Фанат

oncle terrible
Команда форума
Altex
Советы даешь, коды пишешь?
Молодчинка.

оптимальные и удобные.
чтобы удалить одну строчку - перебираем по строчечке весь файл. Именно так поступают Настоящие Программисты.
А еще они пишут таблицы вида
1-3
2-6
3-9
4-12
...
 

Altex

Новичок
Фанат
Наверное ты прав, у меня слишком мало времени, чтобы подумать, и слишком много, чтобы писать код. Буду рад услышать твой вариант.
 

Фанат

oncle terrible
Команда форума
а че там слушать?
очевидно же, что надо перебирать не массив с файлом, а массив с номерами строк и их ансетить.
потом сделать имплод и за один раз записать все в файл.
 

Altex

Новичок
Я этот вариант рассмотрел в первую очередь в своем первом посте в этой теме. другое дело что я подумал, что в этом случае получается просто лишний implode(), что просто замедляет работу скрипта, и поэтому привел пример алгоритма (если можно так сказать) приведенного (в том же моем посте) под номером 2.

Я все же не делал тестов, но думаю второй вариант будет выполняться быстрее.
 

Фанат

oncle terrible
Команда форума
то есть ты считаешь, что работа с диском - быстрее, чем с оперативной памятью?
Вопросов больше не имею.
 

Altex

Новичок
Фанат
Нет, я думаю, что и ты не считаешь, что я считаю так, как ты спросил. И ещё я считаю, в дополнение ко всему, что в обоих вариантах работа с диском занимает одинаковое количество времени. Не надо писать загадками, со всяким может случится ступор, давай на чистоту уже выкладывай свои мысли, хоть тебе они и кажутся очевыдными. :)
 

Фанат

oncle terrible
Команда форума
я считаю, что за одну порцию записать на диск будет быстрее, чем по чайной ложке.
Возможно, разница и будет незаметной, с учетом объема файла и кэширования, но тем не менее запись по кусочку не может быть быстрее, чем запись куском.
 

Altex

Новичок
Фанат
PHP:
<?php

    function timer($reset = false) {
        global $TIMER;
        if ($reset) $TIMER = 0;
        $sec = explode(' ', microtime());
        $TIMER = $sec[0] + $sec[1] - $TIMER;
    }
    $aText = array();
    for ($i = 0; $i < 100000; $i++)
    {
        $aText[$i] = md5(rand(0,10000000000));
    }

    timer(true);
// 0.6 sec
/*
    $f = fopen('file.txt', 'w');
    for ($i = 0; $i < 100000; $i++)
    {
    fwrite($f,$aText[$i]);
    }
    fclose($f);
*/

// 6 sec
/*
    $f = fopen('file.txt', 'w');
    fwrite($f,implode('',$aText));
    fclose($f);
*/
    timer();
    echo $TIMER;
?>
 

Demiurg

Guest
Altex
у меня твой же код показывает в первом случае 4 секунды во втором - одну.
 

Altex

Новичок
Щас попробую на другом хостинге.
Просьба протестировать ещё кого-нибудь, кому интересно, и сообщить результаты.
 

Altex

Новичок
Попробывал. Очень противоречивые результаты. Думается что это может быть связано с memory limit. Я менял размер массива $aText, при этом наблюдались 3 варианта:
1) сервер возвращал Zoro Size Replied;
2) первый или второй вариант быстрее;
3) одинаково
 
Сверху