2011-06-05 70 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)); 

因为以后你只使用它们生成的值。