Цикл в цикле

Тема в разделе "Как сделать...", создана пользователем EkleP, 11 фев 2012.

  1. EkleP

    EkleP Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    0
    Симпатии:
    0
    Задача состоит в том, что бы пропарсить все страницы в каждой из известных категорий.
    Имеем массив категорий:
    PHP:
    $cat = array('cat_1''cat_2''cat_3''cat_4''cat_5');
    Ссылки для любой из категорий имеют следующий вид:
    PHP:
    http://www.example.com/index.php?cat=cat_1&page=1
    Последней страницы не существует! То есть начинает выводить: "Ничего не найдено!".
    Вот, что написал я:
    PHP:
    $cat = array('cat_1''cat_2''cat_3''cat_4''cat_5');
    foreach (
    $cat as $_cat) {
      for (
    $page 0$resp 1; ++$page) {
          
    $content file_get_contents('http://www.example.com/index.php?cat='.$_cat.'&page='.$page);
          if (
    preg_match('#Ничего не найдено!#'$content)) {
            
    $resp 1;
          }
          else {
            
    // Парсим страницу
          
    }
      }
    }
    Но всегда парсит только одну категория, то есть выводит 5 массивов с одними и теми же данными.
    Буду благодарен за любую помощь, спасибо!
     
  2. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    ну для начала тут ошибка у тебя
    PHP:
    $cat = array('cat_1''cat_2'cat_'3''cat_4''cat_5');
    а надо
    PHP:
    $cat = array('cat_1''cat_2''cat_3''cat_4''cat_5');
     
  3. EkleP

    EkleP Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    0
    Симпатии:
    0
    Здесь все написано упрощенно. Массив для примера.
     
  4. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    ну ХЗ что ты там упростил :) но твой упрощенный если говорить именно о циклах в таком виде
    PHP:
    <?php
    $cat 
    = array('cat_1''cat_2''cat_3''cat_4''cat_5');
    foreach (
    $cat as $_cat) {
      for (
    $page 0$page<5$page++) {
        
    /* $content = file_get_contents('http://www.example.com/index.php?cat='.$_cat.'&page='.$page);
          if (preg_match('#Ничего не найдено!#', $content)) {
            $resp = 1;
          }
          else {
            // Парсим страницу
          }*/
    echo 'парсим страницы<br>';
      }
      echo 
    'парсим категорию'.$_cat.'<br>';
    }
     
    ?>
    выдает
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим категориюcat_1
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим категориюcat_2
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим категориюcat_3
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим категориюcat_4
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим страницы
    парсим категориюcat_5
    выкладывай не упрощенный :)
     
  5. EkleP

    EkleP Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    0
    Симпатии:
    0
    Все верно. Проходим категории. Но там где "парсим страницы" он парсит значения первой категории.
    То есть:
    Категория 1
    Страница 1, категория 1
    Страница 2, категория 1
    Категория 2
    Страница 1, категория 1
    Страница 2, категория 1
    и т.д.
     
  6. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    почему-то в моем примере :D получается так
    парсим категорию cat_1
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим категорию cat_2
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим категорию cat_3
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим категорию cat_4
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим категорию cat_5
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке
    парсим страницы Перейти по ссылке

    PHP:
    <?php
    $cat 
    = array('cat_1''cat_2''cat_3''cat_4''cat_5');
    foreach (
    $cat as $_cat) {
        echo 
    'парсим категорию '.$_cat.'<br>';
      for (
    $page 0$page<5$page++) {
        
    /* $content = file_get_contents('http://www.example.com/index.php?cat='.$_cat.'&page='.$page);
          if (preg_match('#Ничего не найдено!#', $content)) {
            $resp = 1;
          }
          else {
            // Парсим страницу
          }*/
    echo 'парсим страницы http://www.example.com/index.php?cat='.$_cat.'&page='.$page.'<br>';
      }
     
    }
     
    ?>
    а вообще этот $resp = 1; после выхода из цикла страниц хотябы в ноль надо перевести
     
  7. EkleP

    EkleP Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    0
    Симпатии:
    0
    Понимаешь вся загвоздка в том, что ты указал значение последней страницы $page<5, у меня он должен прекратить свою работу когда $resp = 1; то есть когда на странице будет найдено
    PHP:
    preg_match('#Ничего не найдено!#'$content)
     
  8. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    дак он у тебя всегда равен единице после уже первой категории
     
  9. EkleP

    EkleP Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    0
    Симпатии:
    0
    Вот решение)
    PHP:
    foreach(/* ... */)
    {
        
    $i 0;
        while(
    true)
        {
            
    $c file_get_contents(/* ... */);
            if( 
    preg_match(/* ... */) )
            {
              break;
            }
            
            
    // parse page
            
            
    $i++;
        }

    Всем спасибо!) Тема закрыта.