PHP - проблемы с бесконечным циклом

0

Я понятия не имею, что я делаю неправильно. КАЖДЫЙ раз, когда он проходит через него, он просто зацикливается и тянет все города, перечисленные в одной строке, и помещает их в состояние, а затем, когда он переходит в следующее состояние, он начинается в правильном месте, но все равно продолжает двигаться. Я пробовал в течение 4 часов, я просто не могу понять это.

$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url); 
$doc = new DOMDocument();

libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors

$xpath = new DOMXpath($doc);    

foreach ($xpath->query('//h1') as $e) {
    $country = $e->nodeValue;
    $list = array();
    foreach ($xpath->query('./following-sibling::div[@class="colmask"]', $e) as $li) {

        foreach ($xpath->query('//div/h4', $e) as $div) {
            $state = $div->nodeValue;


            foreach ($xpath->query('./following-sibling::ul/li', $div) as $div2) {                      

                $href =  $div2->getAttribute("href");
                $text = trim(preg_replace("/[\r\n]+/", " ", $div2->nodeValue));
                echo 'Country: ' . $country . ' State: ' . $state . ' CITY: text['. $text . '] href[' . $href . '] <br/><br/><br/>';


            }


        }

    }
}  
  • 1
    4 вложенных цикла foreach .
  • 0
    Я не знал, как еще это сделать ... Элементы находятся вне друг друга, и мне нужно было захватить 2 разных "заголовка" в верхней части цикла для городов.
Показать ещё 6 комментариев
Теги:

2 ответа

0
Лучший ответ

Если бы кто-то назвал DuffyDake, ответьте на мой вопрос. Вот ответ.

foreach ($xpath->query('./following-sibling::ul[1]/li', $div) as $div2) {                      

                $href =  $div2->getAttribute("href");
                $text = trim(preg_replace("/[\r\n]+/", " ", $div2->nodeValue));
                echo 'Country: ' . $country . ' State: ' . $state . ' CITY: text['. $text . '] href[' . $href . '] <br/><br/><br/>';


            }

Отсутствующий кусок - это [1], чтобы ссылаться на первый найденный UL, а не на то, что прошло

1

Вы должны избегать вложенных query как вы это делаете. Используйте скорее DOMNodeList, полученный на каждой итерации, с помощью метода item.

Например, вместо написания:

foreach ($xpath->query('./following-sibling::div[@class="colmask"]', $e) as $li) {
    foreach ($xpath->query('//div/h4', $e) as $div) {
        $state = $div->nodeValue;

Написать:

$result = $xpath->query('./following-sibling::div[@class="colmask"]', $e);
$state = $result->item(0)->nodeValue;

Если вам нужно перейти из состояния DOMNode $state, используйте $state->parentNode, $state->nextSibling и/или $state->previousSibling

  • 0
    Я сделал это, и он по-прежнему правильно отображает имя $ state, но как мне вытащить города из следующего узла?
  • 0
    Я обновил свой ответ
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню