2017-01-09 4 views
0

bisher verwaltet ive 2 Elemente von einer externen Website kratzen auf meiner Testseite: http://mt-cloud.co.uk/nhs/2 separate foreach Schleifen

(Bitte auf der Seite ein Testsuchergebnisse anzuzeigen)

$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']"); 

ich habe 2 foreach-Schleifen:

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


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

$ result1 = Name eines GP Praxis result2 $ = Adresse der GP Praxis

Wie Sie auf der Testseite sehen, sind meine Ergebnisse 1 und 2 getrennt..wie bekomme ich die, also habe ich Praxisname und Praxisadresse zusammen?

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; 
} 

Gibt nur ein Ergebnis eher als all

Hier ist mein voller PHP-Code:http://mt-cloud.co.uk/nhs/content/code

Bild von Daten ich bin versuchen zu kratzenhttp://mt-cloud.co.uk/nhs/content/results.png

+0

Was meinen Sie damit, dass _ $ result1 und $ result2 zusammen sind? Wie genau willst du sie zusammenführen? Und von dem, was ich sehen kann, sind Ihre 'foreach's nutzlos, weil Sie die Werte in' $ result1' und '$ result2' Variablen überschreiben und am Ende jeder Schleife haben Sie nur den Wert des letzten Elements in diesen Variablen – EhsanT

+1

Der Link ist ein 404 an meinem Ende. Sie sollten eine * kleine * Stichprobe der Eingabedaten in die Frage einfügen. –

+0

@EhsanT - Wenn ich zusammen sage, ich meine, es zeigt GP Practice Name (result1) und dann auf der nächsten Zeile GP Practice Address (result2) dann die Schleife auf die nächste. – itguyme

Antwort

1

Sie erste Code pnames gleich war in Ordnung, müssen Sie speichern Ihre Namen und Adressen nur in eine 2-dimensionale Array und durchlaufen Sie dann Ihr Array.

Dieser Teil des Codes ist genau das gleiche wie Sie:

$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']"); 

Jetzt werden wir ein Array erstellen:

$results = array(); 

Dann nutzen Sie Ihre Loops und speichern Namen und Adressen als Paare in derselben indexs des Arrays:

$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++; 
} 

Jetzt haben wir ein Array mit Paaren von Namen und Adressen und wenn wir Throug Schleife h, wir können sie zusammen sehen:

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

Das ist alles. Der vollständige Code sieht dann so aus:

<?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 ... du absolute Schönheit! vielen dank, dass du dir die zeit genommen hast und dabei geholfen hast - das funktioniert super! Ich kann Ihnen nicht genug danken! – itguyme

+0

:) Sie sind willkommen – EhsanT

0

So verwenden Sie einfach nicht foreach:

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

Hinweis: Sie müssen die Länge der Adressen stellen Sie sicher,

+0

Es funktionierte ABER! Es zeigt nur ein Ergebnis und nicht alle Praktiken an. für ($ i = 0; $ i saveHTML ($ pnames [$ i]); $ name = str_replace (' saveHTML ($ adressen [$ i]); echo $ name. '
'. $ Adresse; } –
itguyme

+0

@itguyme Können Sie Ihren Code debuggen und den Wert von $ pnames und $ -Adressen anzeigen? Ich habe meinen Code mit 2 einfachen Arrays getestet und es hat funktioniert. – Tri

+0

hier ist mein Fullcode: http://mt-cloud.co.uk/nhs/content/code – itguyme

Verwandte Themen