2016-07-18 19 views
0

Ich möchte einige Daten über die Temperatur und die relative Luftfeuchtigkeit der Stadt von einer Website (z. B. http://www.example.com/weather.htm) bekommen.setzen Inhalt der Webseite zu Array mit PHP

Der Quellcode dieser Website

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Weather</title> 
</head> 
<body> 
<p><span><pre id='ming'> 
18-7-2016   
      temperature  
Hong Kong  20.3    
London  16.8    
Washington 15.2     

       relative humidity 

Hong Kong   80% 
London    75% 
Washington   60%  
</pre></span></p> 
</body> 
</html> 

definiere ich ein Array über eine Art Stadt vor und dann verwende ich PHP einfache HTML-DOM-Parser Daten zu erhalten.

<?php 
require "simple_html_dom.php"; 
$c=array("London","Washington","Hong Kong"); 
$temp=array(); 
$rh=array(); 
$date=""; 
$html = file_get_html('test.htm'); 
foreach($html->find('pre#ming') as $e) 
    $links[] = $e->innertext . '<br>'; 

print_r($links); 
?> 

Der Link Array $

Array ([0] => 18-7-2016 temperature Hong Kong 20.3 London 16.8 Washington 15.2 relative humidity Hong Kong 80% London 75% Washington 60% 
) 

alle anzeigen Wie kann ich das Datum, Temperatur und relative Luftfeuchtigkeit von Daten aus $ link und steckt es in $ date, $ temp und $ rh ($ temp erhalten und $ rh sortieren nach $ c)?

Zum Beispiel sollte Array sein:

//$temp 
Array 
(
    [0] => 16.8 
    [1] => 15.2 
    [2] => 20.3 
) 

//$rh 
Array 
(
    [0] => 16.8 
    [1] => 15.2 
    [2] => 20.3 
) 
+0

Je nachdem, ob Sie sind sicher, dass es nur X Städte jedes Mal sein wird, (wo X bekannt ist), können Sie entweder explode() oder preg_match/preg_match_all verwenden, um jedes Teil zu erhalten. – Julqas

+0

@Julqas Cities X ist bekannt, aber wie bekommt man das Datenformular Array $ link? – paul0080

+0

Mit explode zum Beispiel, können Sie '$ data = explode ('', $ link [0]);' um jeden Ausdruck in ein neues Array zu haben. Indem Sie dieses Array erkunden, extrahieren Sie Ihre Daten. Es ist nicht sehr sauber, ich würde hier einen REGEXP empfehlen, zum Beispiel mit preg_match_all :)! – Julqas

Antwort

1

Unter der Annahme, die inhaltliche Struktur der Website ändert sich nie

<?php 

    $mainArray = Array (0 => "18-7-2016 temperature Hong Kong 20.3 London 16.8 Washington 15.2 relative humidity Hong Kong 80% London 75% Washington 60%"); 
    $dateArray = []; 

    foreach($mainArray as $data): 

    list($date,$arr) = explode(" ",$data,2); 
    $dateArray[] = $date; 

    // taking index 
    $tempIndex = strpos($arr,"temperature"); 
    $rhIndex = strpos($arr,"relative humidity"); 

    // taking substring with only city and its value 
    $tempString = substr($arr,strlen("temperature ") + $tempIndex,($rhIndex - (strlen("temperature ") + $tempIndex))); 
    $rhString = substr($arr,strlen("relative humidity ") + $rhIndex); 

    $cityArray = ["Hong Kong","London","Washington"]; 
    $tempArray = []; 
    $rhArray = []; 

    foreach($cityArray as $city): 

     // extracting temperature values 
     if(strpos($tempString,$city) !== FALSE): 
      $tempArray[$city] = substr($tempString,strpos($tempString,$city) + strlen($city) + 1); 
      $splitArray = explode(" ",$tempArray[$city]); 
      $tempArray[$city] = $splitArray[0]; 

     endif; 

     // extracting humidity values 
     if(strpos($rhString,$city) !== FALSE): 
      $rhArray[$city] = substr($tempString,strpos($tempString,$city) + strlen($city) + 1); 
      $splitArray = explode(" ",$rhArray[$city]); 
      $rhArray[$city] = $splitArray[0]; 
     endif; 
    endforeach; 

    print_r($tempArray);echo "<br>"; 
    print_r($rhArray); 

    endforeach; 
    print_r($dateArray); 
?> 

Dies würde Ihnen folgendes Ergebnis

//temperature 
Array ([Hong Kong] => 20.3 [London] => 16.8 [Washington] => 15.2) 

//rh 
Array ([Hong Kong] => 20.3 [London] => 16.8 [Washington] => 15.2) 

//date 
Array ([0] => 18-7-2016) 
+0

Wie kann ich das Datum 18-7-2016 bekommen? Neuen Index hinzufügen? – paul0080

+0

Wie möchten Sie die Datumswerte ?? Als ein anderes Array? –

+0

In Variable $ date – paul0080

0

Sie ein REGEXP zum Beispiel können alle Daten, die Sie extrahieren möchten.
Dies ist eine hässliche und statische Beispiel, aber es ist für Sie den Punkt zu bringen:

preg_match('#[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}[a-zA-Z ]+([\d.]+)[a-zA-Z ]+([\d.]+)[a-zA-Z ]+([\d.]+)[a-zA-Z ]+([\d.]+)[a-zA-Z% ]+([\d.]+)[a-zA-Z% ]+([\d.]+)#',$link[0],$matches); 

zurückkehren würde
MATCH 1 
1. [32-36] `20.3` 
2. [44-48] `16.8` 
3. [60-64] `15.2` 
4. [93-95] `80` 
5. [104-106] `75` 
6. [119-121] `60` 

Sie können auch einen anderen Ansatz haben, tun nehmen Sie regexp wie diese ([0-9.]+) und nicht die ersten 3, die für das Datum usw. sind.

+0

Diese Lösung ist in Ordnung, aber ich möchte das Ergebnis wie // $ temp Array ( [0] => 16,8 [1] => 15,2 [2] => 20,3 ) // $ rh Array ( [0] => 16.8 [1] => 15.2 [2] => 20.3 ) – paul0080

+2

Ich werde nicht die Arbeit für Sie tun, es ist nicht das Ziel :) Sie haben jetzt einen Anhaltspunkt, um ein wenig weiter zu gehen, haben Sie einen neuen Ansatz, um die Daten aus Ihrer Variable $ Links zu extrahieren, müssen Sie entscheiden Welche Art und Weise wollen Sie verwenden, und verwalten Sie die extrahierten Daten, um Ihre beiden Arrays – Julqas

0

Wenn sie jemals das Format des Inhalts auf dieser Website ändern, haben Sie ein Problem, aber mit diesem Array würde ich etwas tun:

$arr = Array (0 =>' 18-7-2016 temperature Hong Kong 20.3 London 16.8 Washington 15.2 relative humidity Hong Kong 80% London 75% Washington 60% 
    '); 
$c=array("London","Washington","Hong Kong"); 

//SPLIT STRING on TEMPRATURE 
$tmp = explode('temperature' , $arr[0]); 
//GET PART BEFORE temperature 
//REMOVE SPACES FROM FRONT and END 
$date = trim($tmp[0]); 

//GET OTHER PARTS 
$tmp = explode('relative humidity' , $tmp[1]); 
$temperature = $tmp[0];   
$humidity = $tmp[1]; 

function get_city($city,$a){ 
    $regex='/(\b'.$city.'\b\s+)(([0-9]+\.[0-9]+)|([0-9]+))/'; 
    preg_match($regex,$a,$matches); 
    if(isset($matches[0])){ 
     $ret = str_replace($city,'',$matches[0]); 
     $ret = str_replace(' ','',$ret); 
     return $ret; 
     } 
    else{ 
     return false; 
     } 
    } 

foreach($c as $nr=>$city){ 
    $temp[$nr] = get_city($city,$temperature); 
    } 
foreach($c as $nr=>$city){ 
    echo $humidity.'<br>'; 
    $hum[$nr] = get_city($city,' '.$humidity); 
    } 

echo $date.'<br>'; 
echo '<pre>'.print_r($temp,true).'</pre><br>'; 
echo '<pre>'.print_r($hum,true).'</pre><br>'; 
+0

Wie sortiere ich die Datenbank auf $ c in meinem PHP-Code? – paul0080

+0

Ah sorry, verpasste diesen Teil :-) – Michel

+0

Ich änderte die Antwort, um Ihre Anforderung der Sortierung zu erfüllen. – Michel