2017-01-09 4 views
0

до сих пор ив удалось наскрести 2 элементов с внешнего сайта на тестовой странице: http://mt-cloud.co.uk/nhs/Объединить 2 отдельных Еогеасп петли

(Пожалуйста, поиск тест на странице просмотра результатов)

$ch = curl_init('http://www.nhs.uk/service-search/GP/m410ux/Results/4/-2.35167407989502/53.4519462585449/4/0?distance=25'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
$output = curl_exec($ch); 
curl_close($ch); 

$document = new DOMDocument; 
libxml_use_internal_errors(true); 
$document->loadHTML($output); 
$document->encoding = 'utf-8'; 
$xpath = new DOMXPath($document); 
$pnames = $xpath->query("//th[@class='fctitle']"); 
$addresses = $xpath->query("//td[@class='fcdetails fc-first']"); 

у меня 2 Foreach петли:

foreach ($pnames as $pname) { 
$result1 = $document->saveHTML($pname); 
} 


foreach ($addresses as $address) { 
$result2 = $document->saveHTML($address); 
} 

$ result1 = имя GP Practice $ result2 = Адрес GP Practice

Как вы видите на тестовой странице, мои результаты 1 и 2 разделены. Как я их получаю, поэтому у меня есть Имя Практики и Практика?

UPDATE (@Tri)

for($i = 0; $i < count($pnames); $i++){ 
$name= $document->saveHTML($pnames[$i]); 
$name=str_replace ('<a href="/Services/', '<a href="http://www.nhs.uk/Services/', $name); 
$address = $document->saveHTML($addresses[$i]); 

echo $name.'<br>'.$address; 
} 

только возвращает один результат, а не все

Вот мой полный код PHP:http://mt-cloud.co.uk/nhs/content/code

Изображение данных я пытаясь очиститьhttp://mt-cloud.co.uk/nhs/content/results.png

+0

Что вы подразумеваете под словом _ $ result1 и $ result2 together_? Как именно вы хотите объединить их? И из того, что я вижу, ваши 'foreach' бесполезны, потому что вы переписываете значения в переменные $ result1 и $ result2, а в конце каждого цикла вы имеете только значение последнего элемента в этих переменных – EhsanT

+1

Ссылка 404 на моем конце. Вы должны включить * маленький * образец входных данных в вопрос. –

+0

@EhsanT - Когда я говорю вместе, я имею в виду, что он отображает GP Practice Name (result1), а затем на следующей строке GP Practice Address (result2), тогда цикл переходит к следующему. – itguyme

ответ

1

Вы первый код был в порядке, вам просто нужно хранить имена и адреса в 2-мерный массив, а затем цикл через массив.

Эта часть коды точно так же, как ваши:

$ch = curl_init('http://www.nhs.uk/service-search/GP/m410ux/Results/4/-2.35167407989502/53.4519462585449/4/0?distance=25'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
$output = curl_exec($ch); 
curl_close($ch); 

$document = new DOMDocument; 
libxml_use_internal_errors(true); 
$document->loadHTML($output); 
$document->encoding = 'utf-8'; 
$xpath = new DOMXPath($document); 
$pnames = $xpath->query("//th[@class='fctitle']"); 
$addresses = $xpath->query("//td[@class='fcdetails fc-first']"); 

Теперь мы создадим массив:

$results = array(); 

Затем используйте ваши петли и название магазинов и адрес в виде пара в одном индексировании массива:

$iCnt = 0; 
foreach ($pnames as $pname){ 
    $results[$iCnt]['name'] = $document->saveHTML($pname); 
    $iCnt++; 
} 

$iCnt = 0; 
foreach ($addresses as $address){ 
    $results[$iCnt]['address'] = $document->saveHTML($address); 
    $iCnt++; 
} 

Теперь у нас есть массив с парами имен и адресов, и если мы прокручиваем его, мы можем видеть их вместе:

for($iCnt = 0, $cnt = count($results); $iCnt < $cnt; $iCnt++){ 
    echo 'Name: '.$results[$iCnt]['name'].'<br>'; 
    echo 'Address: '.$results[$iCnt]['address'].'<br>'; 
} 

Вот и все. Полный код будет выглядеть так:

<?php 
$ch = curl_init('http://www.nhs.uk/service-search/GP/m410ux/Results/4/-2.35167407989502/53.4519462585449/4/0?distance=25'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
$output = curl_exec($ch); 
curl_close($ch); 

$document = new DOMDocument; 
libxml_use_internal_errors(true); 
$document->loadHTML($output); 
$document->encoding = 'utf-8'; 
$xpath = new DOMXPath($document); 
$pnames = $xpath->query("//th[@class='fctitle']"); 
$addresses = $xpath->query("//td[@class='fcdetails fc-first']"); 

$results = array(); 

$iCnt = 0; 
foreach ($pnames as $pname){ 
    $results[$iCnt]['name'] = $document->saveHTML($pname); 
    $iCnt++; 
} 

$iCnt = 0; 
foreach ($addresses as $address){ 
    $results[$iCnt]['address'] = $document->saveHTML($address); 
    $iCnt++; 
} 

for($iCnt = 0, $cnt = count($results); $iCnt < $cnt; $iCnt++){ 
    echo 'Name: '.$results[$iCnt]['name'].'<br>'; 
    echo 'Address: '.$results[$iCnt]['address'].'<br>'; 
} 
?> 
+0

WOW ... вы абсолютная красота! большое спасибо за то, что нашли время и помогли с этим - это отлично работает! Я не могу тебя отблагодарить! – itguyme

+0

:) добро пожаловать – EhsanT

0

Так просто не использовать Еогеасп:

for($i = 0; $i < count($pnames); $i++){ 
    $name= $document->saveHTML($pnames[$i]); 
    $address = $document->saveHTML($addresses[$i]); 
    //do something with your result 
} 

Примечание: вы должны убедиться, что длина адреса, равных pnames

+0

Он работал, НО! он отображает только один результат, а не все методы. для ($ i = 0; $ i saveHTML ($ pnames [$ i]); $ name = str_replace (' saveHTML ($ addresses [$ i]); echo $ name. '
'. $ Address; } –
itguyme

+0

@itguyme Можете ли вы отладить свой код и показать значение $ pnames и $ адресов? Я тестировал свой код с помощью 2 простых массивов, и он работал. – Tri

+0

вот мой полный код: http://mt-cloud.co.uk/nhs/content/code – itguyme

Смежные вопросы