За последние 24 часа нас посетили 49202 программиста и 1758 роботов. Сейчас ищут 795 программистов ...

Постраничный вывод избранных строк из файла

Тема в разделе "Прочие вопросы по PHP", создана пользователем SEAr, 18 июл 2007.

  1. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Здравствуйте, уважаемые!

    Подскажите, plz, как возможно организовать постраничный вывод ИЗБРАННЫХ строк из файла. По функциональности аналогично SQL запросу [sql]SELECT name FROM sites WHERE flag=1 LIMIT ".($onpage*$p).",".$onpage[/sql]. Важно чтобы при каждом вызове скрипта не нужно было бы считывать все строки, т.к. файл может достигать больших размеров...
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    база данных - это средство хранения данных в файлах + инструменты оптимальной обработки.
    http://ru2.php.net/manual/ru/function.fopen.php
    для того чтобы добраться до конца файла придется его перебрать.
     
  3. Davil

    Davil Guest

    Либо проиндексировать переводы строк и использовать fseek.
     
  4. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Хм, не обязательно перебирать все. Использование fseek и freed позволяет считывать только необходимые строки, используя смещения...
     
  5. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Это понятно, но проблема в том, что нужно выводить именно избранные строки...
     
  6. Davil

    Davil Guest

    И в чем проблема, если известно каждый начальный и конечный индекс каждой строки?
     
  7. Anonymous

    Anonymous Guest

    SEAr, смените аватар. Разрешены только личные фото.
     
  8. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Ну, например, считываем $onpage количество строк с условилем, что если строка не подходит, то $onpage++. В результате каждый раз функция перебирает разное кол-во строк, в зависимости от того сколько ненужных строк попалось в конкретной выборке. Проблема в том, что невозможно знать конкретую точку входа при каждом обращении
     
  9. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Придётся считывать LIMIT строк поочерёдно, начиная от OFFSET. И при считывании каждой строки проверять условие. Если подходит, то заносим строку в результирующий массив, иначе читаем дальше.
    ЗЫ Каким образом данные вобще хранятся в файле?
     
  10. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0

    Да собственно об этом я и говорю. Только вот кол-во строк, считанных за каждую итерацию разное...
    Данные храняться так:
    Строка состоит из нескольких полей строго определенной длины; как следствие стоки тоже статичной длины. Каждая строка имеет уникальный инкремент ключ и битовое поле с возможными значениями 0 или 1 (выводить/не выводить).
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Дак ещё проще. fseek'ом прыгаем через (длина_строки*номер строки) байт. За одну итерацию прыгаем на одну строку.
    PHP:
    1.  
    2. $offset = 4;
    3. $limit = 3;
    4. $strlen = 50;
    5.  
    6. for ($i = $offset; $i < ($offset + $limit); $i++) {
    7.     // прыгаем через $i*$strlen байт
    8.     // читаем строку
    9.     // проверяем её
    10.     // заносим в общий массив
    11. }
    Если длины строк разные, то в отдельном файле можно хранить длину каждой строки и учитывать это при работе с fseek.
     
  12. Davil

    Davil Guest

    SEAr
    предварительно проиндексировать надо.
     
  13. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Да, так оно и есть, но...если $page= например, 2,3,4... все равно читать с конца? Хотя, думаю, другого выхода нет...
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Я для чего ввёл переменную $offset? Для того, чтобы не читать с начала! Мы прочитаем только $limit*$strlen байт.
     
  15. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Ошибся словом я просто :) С конца, конечно... Т.е. получиться если нажать последнюю страницу скрипт переберет все строки
     
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А $limit то для чего? :D
     
  17. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0

    Как я понял, $limit это количество строк...Так? И если запросить последнюю страницу скрипт будет с конца перебирать строки, отбирать нужные, пока не считает все и отдаст последние $onpage
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  19. Anonymous

    Anonymous Guest

    Ребят, вы изобрели простенькую БД )))
    Еще лет 10 и составите конкуренцию MySQL )))
     
  20. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    :D А неплохая идея... MySQL, хм... Порвем на британский флаг
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    У меня кста где-то валялись наброски файловой БД. Тока там было немного всё по другому. Данные в отдельном файле кучей. В отдельном файле имена столбцов и размер каждого ряда. Только вот скорость... :D
     
  22. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    (пошел офф) приходилось писать сбалансированное дерево на сях с похожей целью. ))
     
  23. SEAr

    SEAr Активный пользователь

    С нами с:
    18 июл 2007
    Сообщения:
    21
    Симпатии:
    0
    Ну длины полей лучше первой строкой в самом файле указывать. А зарубаться с названиями полей и язык запросов составлять ненужная работа. Еще и парсить потом это...
     
  24. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В файле с данными нет такого понятия, как новая строка для отделения рядов. Сами данные могут содержать переводы строк. Навигация осуществлялась благодаря известным длинам строк.
    ЗЫ да и PHP давно предоставил нам SQLite.