Перезаписать файл в определенной строке

Тема в разделе "Как сделать...", создана пользователем verfaa, 27 мар 2014.

Статус темы:
Закрыта.
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    words.txt содержит 2 строки:
    1111 (нужно заменить эту строку на 0000)
    2222

    Выполняю код:
    Код:
    $c = file('words.txt');
        $c[0]++;
        $fp = fopen('words.txt','w');
        fputs($fp,$c[0]);
        fclose($fp); 
    После выполнения кода, исчезает вторая строка 2222. Хелп!
     
  2. MagicNoob

    MagicNoob Создатель

    Регистр.:
    27 фев 2014
    Сообщения:
    15
    Симпатии:
    3
    PHP:
        $c file('words.txt');
        
    $c[0]="0000\n";
        
    $result implode($c);  
        
    $fp fopen('words.txt','w');
        
    fputs($fp,$result);
        
    fclose($fp); 
     
    verfaa нравится это.
  3. alffcpu

    alffcpu Создатель

    Регистр.:
    23 окт 2013
    Сообщения:
    22
    Симпатии:
    56
    Если исправлять это то наврное вот так надо.

    Код:
    $c = file('words.txt');
    $c[0]--; //или как в примере выше $c[0] = "0000"; или любую другую строку на любое другое  значение
    file_put_contents('words.txt', implode("\n", $c));
    
     
    verfaa нравится это.
  4. MagicNoob

    MagicNoob Создатель

    Регистр.:
    27 фев 2014
    Сообщения:
    15
    Симпатии:
    3
    При чтении файла в массив у нас уже в каждом элементе, в конце, будет перевод строки. Поэтому вот эта конструкция:
    PHP:
    implode("\n"$c);
    даст отличный от оригинала результат, если исходный файл был:
    Код:
    11111
    22222
    33333
    44444
    то в результате выполнения получится:
    Код:
    00000
    22222
    
    33333
    
    44444
     
    verfaa нравится это.
  5. alffcpu

    alffcpu Создатель

    Регистр.:
    23 окт 2013
    Сообщения:
    22
    Симпатии:
    56
    Вообще да, немного я ошибся.
    Тогда так:
    Код:
    $c = array_map('trim', file('words.txt'));
    $c[0]--; //или как в примере выше $c[0] = "0000"; или любую другую строку на любое другое  значение
    file_put_contents('words.txt', implode("\n", $c));
    
    Если придираться к мелочам, то мой первый вариант бы и не сработал, тк $c[0] не было числом.
     
    verfaa нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Не льсти себе ошибок у тебя куча :-]
    Например зачем делать
    PHP:
    $c array_map('trim'file('words.txt')); 
    если есть гораздо более быстрое решение через флаг функции file?
    PHP:
    $c file('words.txt'FILE_IGNORE_NEW_LINES);
    $c[0]--; - для "1111" вернёт "1110"

    -------------------------------------------------------------------------------------------​

    Второй пост после вопроса ТС содержит наиболее правильное решение для маленьких файлов.
    Для удобочитаемости можно оптимизировать до:
    PHP:
        $c file('words.txt');
        
    $c[0]="0000\n"// \n - для unix или \r\n - для win

        
    file_put_contents('words.txt'$c); //эта функция сама implode сделает
     
    Последнее редактирование: 4 апр 2014
    verfaa нравится это.
Статус темы:
Закрыта.