Помогите с циклом.

Тема в разделе "PHP", создана пользователем komyak, 19 ноя 2009.

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

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    486
    Симпатии:
    187
    Пишу себе граббер(загрузка страниц, распасивание и подготовка sql-дампа). Всё получилось, кроме:
    Моя строка:
    PHP:
    $text trim("VALUES (".$y.", '', '', '".$match2[2][$k]."', '', '', '".$match2[1][$k]."', '', '', '1', '".$y."');");
    Должно получиться:
    PHP:
    VALUES (1'''''text''''''text''''''1''1')
    VALUES (2'''''text''''''text''''''1''2')
    VALUES (3'''''text''''''text''''''1''3')
    и т.дНужночтоб с каждой записью массивазначения id и post увеличивались на один.
    Мой
    PHP:
    for($k=0;$k<=count($match2[1]);$k++){
    for(
    $y=0;$y<=100000);$y++){
    $text trim("VALUES (".$y.", '', '', '".$match2[2][$k]."', '', '', '".$match2[1][$k]."', '', '', '1', '".$y."');");
    fwrite($fh$text."\n");}}}}
    fclose($fh);
    Я что-то перемудрил и в итоге на серваке за 4-6 секунд оказался файлик на 5 гигов... А должен был на 6 метров...
    Подскажите...
     
  2. Eihwaz

    Eihwaz

    Регистр.:
    7 окт 2007
    Сообщения:
    156
    Симпатии:
    54
    При каждой итерации вашего первого цикла, второй 100000 раз записывает строку в файл.
    PHP:
    $y 1;
    for(
    $k=0;$k<=count($match2[1]);$k++){
        
    $text trim("VALUES (".$y.", '', '', '".$match2[2][$k]."', '', '', '".$match2[1][$k]."', '', '', '1', '".$y."');");
        
    fwrite($fh$text."\n");
        
    $y++;
    }
    fclose($fh);  
     
  3. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    486
    Симпатии:
    187
    Не проходит, $y остаётся = 1:
    PHP:
    VALUES (1'''''text''''''text''''''1''1'
    VALUES (1'''''text''''''text''''''1''1'
    VALUES (1'''''text''''''text''''''1''1'
    .....
    Попробовал так:
    PHP:
    $y 1;
    for(
    $k=0;$k<=count($match2[1]);$k++){
    $text trim("VALUES (".$y.", '', '', '".$match2[2][$k]."', '', '', '".$match2[1][$k]."', '', '', '1', '".$y."');");
    $y++;
    fwrite($fp$text."\n");
    }
    Но в итоге получается:
    PHP:
    VALUES (1'''''text''''''text''''''1''1'
    VALUES (2'''''text''''''text''''''1''2')
    VALUES (1'''''text''''''text''''''1''1'
    VALUES (2'''''text''''''text''''''1''2')
    .....
    В $match2 ~ 100к строк, может надо указывать максимальное значение - $y <= 1; ?
     
  4. Eihwaz

    Eihwaz

    Регистр.:
    7 окт 2007
    Сообщения:
    156
    Симпатии:
    54
    У вас там выше по коду где-то есть циклы (хотя по-идее их быть не должно) — смотрите в них
     
    komyak нравится это.
  5. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    486
    Симпатии:
    187
    Есть ешё 2 цикла. Без них не получается выдёргивать.
     
  6. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    и получается, что для каждой страницы, откуда вы берете урлы, вы "обнуляете" значение переменной $y, вынесите $y = 1; за пределы циклов.
     
    komyak нравится это.
  7. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    486
    Симпатии:
    187
    Всё парни спасибо! Теперь и парсит и записывает и считает. Спасибо!
    Добавлено через 4 минуты
    Не знаю почему, но он изначально стоял. Но когда я на Пыхе проверял регулярку, то с
    Код:
    <div>(.*?)<\/div>
    он не хотел ничего выдавать. Также и через print_r смотрел.
     
  8. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    Хорошо что всё получилось..
    Ещё один совет:
    Когда используете такую конструкцию:
    PHP:
    for($k=0;$k<=count($match2[1]);$k++)
    Выносите
    PHP:
    count($match2[1])
    за скобки, ато при каждой итерации у вас заново просчитывается количество элементов в массиве, а при 100К итераций - это большая лишняя нагрузка на сервер.
    Тоесть в итоге надо писать так:
    PHP:
    $myparam count($match2[1]);
    for(
    $k=0;$k<=$myparam;$k++){
    ......
    }
     
    komyak нравится это.
Статус темы:
Закрыта.