За последние 24 часа нас посетили 54658 программистов и 1719 роботов. Сейчас ищут 2119 программистов ...

Цикл.

Тема в разделе "PHP для новичков", создана пользователем lawr, 24 июл 2009.

  1. lawr

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

    С нами с:
    24 июл 2009
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте. Помогите решить проблему. PHP учу ток что не пинайте сильно.
    Итак. Есть текстовик в 25000 строк. Надо разбить его на куски по 150 строк. Читаю из файла в массив норм. Выбираю из масива 150 строк норм тоже. запись тож проходит. А вот как это все зациклить? Как сделатб чтоб в конце файла скрипт остановился? И как сделать чтоб имя файла увелтчивалось само. Типа 1.txt 2.txt и тд?
    Код вот:
    PHP:
    1. <?
    2. $test = file ("mapa.txt");
    3. $arr=array_slice($test, 0, 150);
    4. $tst=fopen("map.html","w");
    5. $arr=serialize($arr);
    6. fwrite ($tst, $arr);
    7. ?>
     
  2. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    PHP:
    1.  
    2. <?php
    3. $filename = "mapa.txt";
    4. $big_content = file($filename);
    5. $omfg = array_chunk($big_content, 150);
    6.  
    7. foreach($omfg AS $key=>$sentences){
    8.  $new_file = ($key+1).".txt";
    9.  $open_file = fopen($new_file, "w");
    10.  
    11.  $new_content = implode("\n\r", $sentences);
    12.  fwrite($open_file, $new_content);
    13.  fclose($open_file);
    14. }
    15. ?>
    16.  
     
  3. lawr

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

    С нами с:
    24 июл 2009
    Сообщения:
    24
    Симпатии:
    0
    Спасибо большое. Работает. А можно пояснения если не трудно). Я пытался поставить в имя файла ++$var и не получалось.
     
  4. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Вообще, здесь все очень просто, даже не знаю, как объяснить. Но, если честно, то я сомневаюсь в правильности этого кода — есть подозрение, что для работы с огромными файлами, существуют специальные функции и методы. Ибо делать массив из 25 тысяч элементов это очень сурово )))

    PHP:
    1.  
    2. <?php
    3.  $filename = "mapa.txt"; // — твой файл с 25 тысячами строк
    4.  $big_content = file($filename); // — массив с 25-ю тысячами элементаов.
    5.  $omfg = array_chunk($big_content, 150); // — функция array_chunk() делит массив на несколько массивов. (Кстати, нужно написать не 150, а 149). В нашем случае, получилось ~167 элементов (25000 делим на 150) в массиве $omfg, а в кажом из этих 167-и элементов еще 150 элементов.
    6. // Напиши здесь вот это — print_r($omfg); — сразу станет понятно.
    7.  
    8.  foreach($omfg AS $key=>$sentences){ // — делаем одно и то же действие 167 раз. Перебираем массив 167 раз. Ну, форэч он и в Африке форэч.
    9.   $new_file = ($key+1).".txt"; // — $key++ неподходит, потому что тогда имена файла будут начинаться с нуля, а нам надо с единицы. Поэксперементируй.
    10.   $open_file = fopen($new_file, "w"); // — создаем файл 1.txt и открываем его для записи
    11.  
    12.   $new_content = implode("\n\r", $sentences); // — берем 150 строчек и сливаем их в одну строчку, разделенную на "\n\r". Кстати, поиграйся с этими "\n\r".
    13.   fwrite($open_file, $new_content); // — пишем в файл наши 150 строк
    14.   fclose($open_file);
    15.  }
    16. // Должно получиться примерно 167 файликов.
    17.  ?>
     
  5. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Ой, не "\n\r", а "\r\n".
     
  6. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Никаких забиваний в массив, читаем файл построчно и напрямую записываем.
    Пишу пример:

    PHP:
    1. <?php
    2.  
    3. $handle = fopen('map.txt', 'r');
    4. $times  = 1;
    5.  
    6. while(!feof($handle)) {
    7.     $writer = fopen("part_{$times}.txt", 'w+');
    8.  
    9.     for($i = 1; $i <= 150; $i++) {
    10.         fwrite($writer, fgets($handle));
    11.     }
    12.    
    13.     fclose($writer);
    14.     $times++;
    15. }
    16.  
    17. fclose($handle);
    18.  
    19. ?>
    Проверено на файле в 1 000 000 строк с убранным таймаутом.
    Скрипт не упал, правда файлы я потом запарился удалять.
     
  7. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Работать будет медленней, чем первый вариант, ибо открывание/закрывание файла 150 раз это ппц.
    Массив из 25 тыщ элементов — тоже ппц, но работает быстрее.
    Оба варианта ужасны.
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Интересно, а у вас файл меньше раз открывается? =)
    У меня хотя бы лишней памяти не используется на массивы.
     
  9. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Да, меньше ;) Посчитайте. 167 раз. А у вас — 167 умножить на 150.

    Да, этим и хорош ваш код.

    А вообще, есть подозрение, что уже изначально есть ошибка в архитектуре приложения.
    Файл называется «mapa.txt» — карта «А» — скорее всего там какие-то географические координаты, ну, или другая инфа. Но она должна явно храниться где-нить в базе и уже выбираться оттуда, явно с каким-нить условием. А парень просто нашел где-то текстовый файл и пытается его использовать.
     
  10. lawr

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

    С нами с:
    24 июл 2009
    Сообщения:
    24
    Симпатии:
    0
    Люди. Не ругайтесь. Мара.тхт это карта сайта в текстовом формате. Просто надо было разделить.Если брать хтмл то тогда еще и гемор с тегами будет. Я сгенерил софтинкой хтмл и сохранил в текстовик. Просто еще не могу делать выборку из бд. А можно тогда еще вопрос? Как паралельно в каждый файл писать основные хтмл теги? (<head><title></title></head>)и тд. Догадываэсь над определить переменые и туда так же в цикле пихать. А вот как реализовать. Х3.
     
  11. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Поясните, что значит как?.
    Функции записи не знаете или что?
    Тэги - это тот же текст, так же записывается в файл, как и любой другой текст.

    PHP:
    1.  
    2. $prefix  = '<html><head><title></title></head><body>';
    3. $postfix = '</body></html>';
    4. fwrite($open_file, $prefix .$new_content .$postfix);
    5.  
     
  12. lawr

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

    С нами с:
    24 июл 2009
    Сообщения:
    24
    Симпатии:
    0
    Кстати норм прошло деление. делил на денвере. Процесс прошел секунд за 20. Так что думаю до предела еще далеко.))))
    Спасибо за помощь.
     
  13. artuska

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

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Вообщем, окей. Но есть подозрение, что что-то у тебя очень медленно работает. Я только что взял фалик (словарь синонимов.txt) — там 19 000 строк. Весь процесс занял 0.15095710754395 секунд — получился 121 файлик.
    Попробовал методом Apple сделать — процесс занял 0.17317390441895 секунд, 121 файлик.

    У тебя 20 секунд — это чересчур много. Хотя если уже разделил то забей, это я просто пишу, самому интересно стало, откуда так много секунд на выполнение взялось ;)