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

Статус
В этой теме нельзя размещать новые ответы.

komyak

Постоялец
Регистрация
4 Фев 2009
Сообщения
483
Реакции
194
Пишу себе граббер(загрузка страниц, распасивание и подготовка 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 метров...
Подскажите...
 
При каждой итерации вашего первого цикла, второй 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);
 
Не проходит, $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; ?
 
У вас там выше по коду где-то есть циклы (хотя по-идее их быть не должно) — смотрите в них
 
У вас там выше по коду где-то есть циклы (хотя по-идее их быть не должно) — смотрите в них
Есть ешё 2 цикла. Без них не получается выдёргивать.
 
и получается, что для каждой страницы, откуда вы берете урлы, вы "обнуляете" значение переменной $y, вынесите $y = 1; за пределы циклов.
 
Всё парни спасибо! Теперь и парсит и записывает и считает. Спасибо!
Добавлено через 4 минуты
ПС: странно, что у вас preg_match_all на регулярное выражение не ругается с неэкранированным слешом
Не знаю почему, но он изначально стоял. Но когда я на Пыхе проверял регулярку, то с
Код:
<div>(.*?)<\/div>
он не хотел ничего выдавать. Также и через print_r смотрел.
 
Хорошо что всё получилось..
Ещё один совет:
Когда используете такую конструкцию:
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++){
......
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху