2011-06-05 71 views
0


這段腳本對我來說太長了。有什麼辦法可以優化它嗎?
PHP如何優化腳本?

function delteg($string){ 
$keyp=0; 
$out=""; 
    for ($i=0; $i<strlen($string); $i++) { 
      if ($string[$i]=="<"): 
      $keyp=1; 
      endif; 

      if ($keyp==0): 
      $out.=$string[$i]; 
      endif; 

      if ($string[$i]==">"): 
      $keyp=0; 
      endif; 

    } 
    $out = substr($out,0,strlen($out)); 
    return $out; 
} 

$time_step = array(); 
$datetime = array(); 
$G = array(); 
$HHii = array(); 
$cloud_cover = array(); 
$precipitation = array(); 
$pressure = array(); 
$temperature = array(); 
$humidity = array(); 
$wind_direction = array(); 
$wind_velocity = array(); 
$falls = array(); 
$drops = array(); 
$n = 0; 

$handle = fopen ("http://rp5.ua/xml/257885/en", "r"); 
while (!feof ($handle)) { 
$buffer = fgets($handle, 4096); 

if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name_trim")>0) ($point_name_trim[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name2")>0) ($point_name2[$n]=delteg($buffer)); 
if (strpos($buffer, "point_timestamp")>0) ($point_timestamp[$n]=delteg($buffer)); 
if (strpos($buffer, "gmt_add")>0) ($gmt_add[$n]=delteg($buffer)); 
if (strpos($buffer, "point_date")>0) ($point_date[$n]=delteg($buffer)); 
if (strpos($buffer, "point_date_time")>0) ($point_date_time[$n]=delteg($buffer)); 
if (strpos($buffer, "time_step")>0) ($time_step[$n]=delteg($buffer)); 
if (strpos($buffer, "datetime")>0) ($datetime[$n]=delteg($buffer)); 
if (strpos($buffer, "G")>0) ($G[$n]=delteg($buffer)); 
if (strpos($buffer, "HHii")>0) ($HHii[$n]=delteg($buffer)); 
if (strpos($buffer, "cloud_cover")>0) ($cloud_cover[$n]=delteg($buffer)); 
if (strpos($buffer, "precipitation")>0) ($precipitation[$n]=delteg($buffer)); 
if (strpos($buffer, "pressure")>0) ($pressure[$n]=delteg($buffer)); 
if (strpos($buffer, "temperature")>0) ($temperature[$n]=delteg($buffer)); 
if (strpos($buffer, "humidity")>0) ($humidity[$n]=delteg($buffer)); 
if (strpos($buffer, "wind_direction")>0) ($wind_direction[$n]=delteg($buffer)); 
if (strpos($buffer, "wind_velocity")>0) ($wind_velocity[$n]=delteg($buffer)); 
if (strpos($buffer, "falls")>0) ($falls[$n]=delteg($buffer)); 
if (strpos($buffer, "drops")>0) :($drops[$n]=delteg($buffer)); 
    $n++; 
endif; 

} 

fclose ($handle); 

for ($i=0; $i<$n; $i++) { 
    echo $country_id[$i]." - ".$point_name[$i]. " etc....."; 

} 
+1

而不是使用優化腳本,嘗試解釋使用它的用途和一些示例內容! – RobertPitt 2011-06-05 10:55:04

回答

4

當然。您應該使用XML解析器,如SimpleXML

例子:

$xml = simplexml_load_file("http://rp5.ua/xml/257885/en"); 

foreach($xml->point as $point) { 
    echo 'Point: ', $point->point_name, PHP_EOL; 
    foreach($point->timestep as $step) { 
     echo "\t Time: ", $step->datetime, PHP_EOL; 
    } 
} 

實在是沒有理由手工解析XML。如果你使用解析器,你可以節省很多麻煩。

0

那麼有些人可能會說使用單引號而不是雙引號,因爲PHP會在使用雙打時插入字符串。一般PHP有一些很好的優化技巧。 http://ilia.ws/archives/12-PHP-Optimization-Tricks.html

這一切看起來從我的觀點,我會說的唯一事情就是點很細,有沒有爲什麼稱它爲在for循環聲明的strlen()的任何理由,因爲這將是更快地稱之爲一次分配該數字給一個變量並在for循環中使用。

哦,是的,並使用XML解析器,帶有一些回調的XML解析器對象可以工作,simpleXML也很好。

0

你的腳本有很多問題。例如:

  • 不使用XML解析器,你只是處理它作爲一個字符串(效率不高,基本上是沒錯的) - 使用例如SimpleXML
  • 代碼多行這不需要,因爲不改變你的代碼的結果 - 下面的示例中的解決方案,
  • 編寫代碼的一致的方式(如使用縮進,使用條件子句相同的符號。) - 不真的很迷人NCE的執行速度,但會幫助你的代碼維護,

的問題在於,例如這裏:

if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name_trim")>0) ($point_name_trim[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name2")>0) ($point_name2[$n]=delteg($buffer)); 
if (strpos($buffer, "point_timestamp")>0) ($point_timestamp[$n]=delteg($buffer)); 
if (strpos($buffer, "gmt_add")>0) ($gmt_add[$n]=delteg($buffer)); 
if (strpos($buffer, "point_date")>0) ($point_date[$n]=delteg($buffer)); 
if (strpos($buffer, "point_date_time")>0) ($point_date_time[$n]=delteg($buffer)); 
if (strpos($buffer, "time_step")>0) ($time_step[$n]=delteg($buffer)); 
if (strpos($buffer, "datetime")>0) ($datetime[$n]=delteg($buffer)); 
if (strpos($buffer, "G")>0) ($G[$n]=delteg($buffer)); 
if (strpos($buffer, "HHii")>0) ($HHii[$n]=delteg($buffer)); 
if (strpos($buffer, "cloud_cover")>0) ($cloud_cover[$n]=delteg($buffer)); 
if (strpos($buffer, "precipitation")>0) ($precipitation[$n]=delteg($buffer)); 
if (strpos($buffer, "pressure")>0) ($pressure[$n]=delteg($buffer)); 
if (strpos($buffer, "temperature")>0) ($temperature[$n]=delteg($buffer)); 
if (strpos($buffer, "humidity")>0) ($humidity[$n]=delteg($buffer)); 
if (strpos($buffer, "wind_direction")>0) ($wind_direction[$n]=delteg($buffer)); 
if (strpos($buffer, "wind_velocity")>0) ($wind_velocity[$n]=delteg($buffer)); 
if (strpos($buffer, "falls")>0) ($falls[$n]=delteg($buffer)); 
if (strpos($buffer, "drops")>0) :($drops[$n]=delteg($buffer)); 
    $n++; 
endif; 

,你真正需要的只有前兩行:

if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer)); 

因爲以後你只使用它們生成的值。