file_put_contents в цикле добавляет пустую строку в конце

Тема в разделе "PHP", создана пользователем verfaa, 3 янв 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    372
    Симпатии:
    41
    Имеется массив:
    Код:
    ......
    [matchmaker] => Array
                                    (
                                        [0] => dating matchmaker in boston upscale matchmaker
    
                                        [1] => matchmaker rockford il
    
                                        [2] => lucas krantz matchmaker painting
    
                                        [3] => matchmaker compatibility
    
                                        [4] => i love lucy the matchmaker
    )
    Необходимо данные из этого массива записать в файл по одному кею на каждую строку.
    И проблема в том, что код
    Код:
    ...
    foreach($d_key_arr as $key){
         if(trim($key) != "") file_put_contents(trim($dor).".txt", $key, FILE_APPEND);
    }
    ...
    
    выполняет эту работу, только в конце всегда вставляет пустую строку. И это несмотря на то, что пустых элементов в массиве нет.
    Почему так происходит и какое условие можно поставить для предотвращения попадания пустых строк в результирующий файл?
     
  2. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    Пробовали без FILE_APPEND?
    Кодировка какая? Возможно не дописан BOM?
    Это из разряда предположений.
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    $key идёт с переносом строки. Сделайте трим и проверку на последний элемент

    PHP:
    $lastI count($d_key_arr)-1;
    foreach(
    $d_key_arr as $i=> $key){
    if(
    trim($key) != ""
    if(
    $i ==$lastI ){
    file_put_contents(trim($dor).".txt"trim($key), FILE_APPEND);
    }else{
    file_put_contents(trim($dor).".txt"trim($key)."\r\n"FILE_APPEND);
    }

    }
     
    Последнее редактирование модератором: 4 янв 2016
  4. StrikeOFF

    StrikeOFF ♥kan inte lyfta utan lift♥

    Регистр.:
    20 мар 2010
    Сообщения:
    362
    Симпатии:
    200
    а зачем проверять $i раз если массиву можно просто последний элемент тримнуть сразу и всё?
     
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Вы, скорее всего, трим не туда приписали:
    Код:
    foreach($d_key_arr as $key){
         if(trim($key) != "") file_put_contents($dor.".txt", trim($key)."\n", FILE_APPEND);
    }
    И если у Вас все записи с новой строчки в файле получаются - это значит перенос строки уже в массиве и удивляться нечему

    Если бы переносов строк в массиве не было, было бы это:
    Код:
    keykeykeykey
     
    AlgoriVismut нравится это.
  6. latteo

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

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    http://php.net/manual/ru/function.file-put-contents.php

    Использовать её в цикле очень плохая практика из-за множества лишних fopen(), fclose()

    Без этого параметра файл будет перезаписываться при каждом вызове функции, что полностью ломает логику при такой реализации кода.

    Если у нас были операции над этим массивом, которые удалили часть элементов, без смешения индексов, имеем ошибку в логике реализации и возможный недостача строк в результате ;)
    При таком алгоритме надо использовать $i++;

    Попробуй набросать рабочий код. Нам всё равно надо проверять if($i ==$lastI ){ для определения, что элемент последний. Хотя твоё замечание может уменьшить количество кода.

    -----------------------------------------------------------------------------------------------

    А вот так это можно решить в одну строку :crazy::
    PHP:
    file_put_contents('not_empty_to_file.txt'implode("\r\n"array_filter(array_map('trim'$matchmaker))));
    Или вот так, чтобы было понятней:
    PHP:
    $matchmaker array_map('trim'$matchmaker); //тримаем все значения
    $matchmaker array_filter($matchmaker); //удаляем все пустые, так же удалит строки состоящие только из нуля '0'
    file_put_contents('not_empty_to_file.txt'implode("\r\n"$matchmaker)); //предполагается что в этот файл мы дописывать больше не будет, иначе надо еще пару строк
     
    Последнее редактирование: 4 янв 2016
    warg и ZiX нравится это.
Статус темы:
Закрыта.