Проинклюдить переменную

Тема в разделе "PHP", создана пользователем Sachek, 8 мар 2011.

Модераторы: latteo
  1. Sachek

    Sachek Умелый

    Регистр.:
    23 мар 2009
    Сообщения:
    383
    Симпатии:
    103
    В общем стоит такая задача. Есть 2 файла. В 1 файле куча переменных в столбик, к примеру
    $1 =1;
    $2 =2;
    $3 =3;
    $4 =4;
    $5 =5;

    Во втором файле необходимо проинклюдить из первого файла скажем переменную 3 или 4 (в общем какую укажу).
    Как выбрать все данных из файла я знаю, а вот как нужную строку?
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    1) через fseek перемещаемся к нужной записи
    типа fseek($fh, №_записи * фикс_длина_записи, SEEK_CUR);
    2) потом читаем fgets($file, фикс_длина_записи);
    ----
    запись примерно также
    1) --- // --- // --- // --- //
    2) fwrite($file, $content)
    $content соответственно с подогнанным размером


    но при этом записи должны иметь фиксированную длину
    т.е. не должны быть строки вида
    Код:
    $1 =1;
    $2 =2123123;
    
    а должно быть что-то типа
    Код:
    $1 =1      ;т.е. строка дополнена мусором  до фикс. длины
    $2 =2123123;
    
     
    Sachok321 нравится это.
  3. Sachek

    Sachek Умелый

    Регистр.:
    23 мар 2009
    Сообщения:
    383
    Симпатии:
    103
    Малеха не догнал. Длина у меня одинаковая - это я забыл сказать.
    То есть получается примерно следующее?
    fseek($fh, 1 * 1, SEEK_CUR);
    //у меня получается номер строки 1 и длина 1
    // номер записи это я как понял номер строки?
    fgets($file, 1);// переменная файл от куда взялась? Или мы в нее считываем?
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    >>>fseek($fh, 1 * 1, SEEK_CUR);
    >>>//у меня получается номер строки 1 и длина 1

    примерно так, только нужно ( номер - 1 ) * размерБлока, т.к. в противном случае мы будет устанавливать указатель вконец нужного блока а нужно вить в его начало что-бы считать .. т.е. "в конец предыдущего блока" .. это я тупанул


    >>>// номер записи это я как понял номер строки?
    не совсем ... номер записи - это номер "блока" данных который нужно считать/записать


    >>>fgets($file, 1);// переменная файл от куда взялась? Или мы в нее считываем?

    $file - это хендел файла ... все файловые ф-ции работают с ним
    т.е. перед вызовом их нужно открыть файл или создать ...



    -------------------------
    к примеру есть файл test.txt с след. содержимым
    Код:
    111222333444555666777888999
    если его "разложить" по вашему примеру то будет что-то типа

    $1=111;
    $2=222;
    $3=333;
    $4=444;
    ....

    предположительно в нем записано 9 чисел ( 9 блоков ) каждый длиной в 3 байта
    т.е. минимальное хранимое значение 0, а максимально 999
    если нужно больше - то увеличьте на байт длину блока и будет уже макс. 9999 ... ну и так далее ...

    ну а далее считаем 4 блок данных
    PHP:
        $dataSize 3// размер блока данных в байтах 
        
    $readBlokNomer 4// номер блока который нужно изменить 
      
        
    $file fopen('test.txt','r+');
        
    fseek($file, ($readBlokNomer-1)*$dataSize);  
        
    $data = (int)fgets($file$dataSize+1); //хз зачем тут +1
        
    $data++;  // инкриментируем ... 
        /**
        * ну и нужно проверить не перевалило ли значение за приделы блока ...
        * а то при записи его урежит .. 
        */
        
    fseek($file, ($readBlokNomer-1)*$dataSize);
        
    // str_pad дополняем пробелами (муссором) до нужной длины 
        
    fputs($filestr_pad($data$dataSize' 'STR_PAD_RIGHT));
        
    fclose($file); 

    ну и должно получиться что-то типа ...
    Код:
    111222333445555666777888999
    т.е. достали 4 блок "444" и увеличили на 1 - вышло => "445"
     
    Sachok321 нравится это.
  5. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    как вам такое решение?

    PHP:
    /**
     * Get row value in file
     *
     * @param   integer     Row number
     * @param   string      [Optional] File name
     * @return  mixed
     */
    function getFileRow$row$file 'data.txt' )
    {
        static 
    $files = array();
        
        if ( empty( 
    $files[$file] ) )
        {
            
    $files[$file] = file$file );
        }
        
        
    $line $files[$file][--$row]; // нумерация в file() идет с нуля, поэтому декрементируем переменную $row
        
        
    return trimsubstr$linestrrpos$line'=' ) + ), ';' );
    }
     
    Sachok321 нравится это.
  6. Sachek

    Sachek Умелый

    Регистр.:
    23 мар 2009
    Сообщения:
    383
    Симпатии:
    103
    На вид попроще :) Но чет не совсем допер.
    Как мне в этом скрипте выбрать именно 3 строку к примеру?
     
  7. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    данное решение хранит в памяти данные всего файла
    более того, эти данные накапливаются из всех файлов которые будут открываться этой ф-цией в статической переменной

    при небольших файлах вполне можно использовать, но в противном случае будет ненужный расход памяти



    как-то так
    PHP:
    $row getFileRow(3'fileName.txt' );
     
    Sachok321 нравится это.
  8. Sachek

    Sachek Умелый

    Регистр.:
    23 мар 2009
    Сообщения:
    383
    Симпатии:
    103
    А как то можно обнулить это накапливание? А то лишний расход ресурсов не оч хоцеца :)
     
  9. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    я приводил в пример эту функцию, если нужно много раз брать данные
    для одной выборке во всем скрипте:

    PHP:
    function getFileRow$row$file 'fileName.txt' )
    {
        
    $lines file$file );
        
    $line $lines[$row 1];
        return 
    trimsubstr$linestrrpos$line'=' ) + ), ';' );
    }
    как-то так :)
     
    Sachok321 нравится это.
  10. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    лучше считать данные функцией File один раз, глобально, и в функцию передавать уже считанный массив.
     
    Sachok321 нравится это.