2016-07-15 57 views
0

我有一种情况,我需要遍历各种XML文档并用xPath替换某些值。到目前为止这么好,但我使用的方法只是感觉不对(但它起作用,至少是某种东西)。在多维数组替换中的PHP效率

我做了什么是我创建了一个多维数组为每个替换类型(为了让它易于管理)与它的替代品。然后我循环这些数组,并将值推到独立阵列,我用它来替换值。像这样:

$regions_original    = Array(); 
$regions_replaced    = Array(); 

$region_replacements = Array(
     "Wrong spelled area 1" => "Area 1", 
     "Wrong spelled area 2" => "Area 2", 
     "Wrong spelled area 3" => "Area 3" 
); 

/* 
* Split regions key/value pairs into two seperate arrays 
*/ 
foreach($region_replacements as $original => $replacement){ 
     array_push($regions_original, $original); 
     array_push($regions_replaced, $replacement); 
} 

$terms      = Array('Area 1','Area 1','Wrong spelled area 1','Area 2','Wrong spelled area 2'); 

foreach($terms as $term){ 
     echo '<li>'.str_replace($regions_original, $regions_replaced, $term).'</li>'; 
} 

看着这让我恶心..它只是不舒服。此外,这种方法还可以替换句子中出现的内容(当这不是我想要的内容时,请参阅下面的示例),所以我想通过检查数组键是否存在于初始数组中,并将其替换为值。就像这样:

foreach($terms as $term){ 
     if(array_key_exists($term, $region_replacements)){ 
      echo '<li>'.$region_replacements[$term].'</li>';  
     }else{ 
      echo '<li>'.$term.'</li>'; 
     } 
} 

这个工作,而且比第一种方法更好,因为第一种方法的东西像下面的任期越来越搞砸:

$terms = array('Sainte Foy'); 
$replacements = array('Sainte Foy' => 'Domaine de Sainte Foy Tarantaise'); 
$output = echo '<li>'.str_replace($regions_original, $regions_replaced, $term).'</li>'; 
//Outputs: Domaine de Domaine de Sainte Foy Tarantaise Tarantaise 

与最后的办法的事情是,执行速度较慢。我用一个约500个元素的XML文件测试了它,差别在执行时间约0.3秒(通过比较文档顶部和底部的microtime测量)。由于源XML文件可以变得更大,我希望代码尽可能高效,并且可以管理和管理

然而,第二种方法'感觉'好多了,虽然我无法忍受(显然)低效率。我希望任何人都可以向我保证,其中一种方法是好的,或者指向正确的方向,使其真正有效。会很好! :)

回答

0

您可以简单地使用你的$region_replacements阵列作为查找表,如果没有找到结果,回声,而不是原词:

$region_replacements = [ 
    "Wrong spelled area 1" => "Area 1", 
    "Wrong spelled area 2" => "Area 2", 
    "Wrong spelled area 3" => "Area 3" 
]; 

$terms = ['Area 1','Area 1','Wrong spelled area 1','Area 2','Wrong spelled area 2']; 

foreach($terms as $term){ 
    echo '<li>'; 
    echo isset($region_replacements[$term]) ? $region_replacements[$term] : $term; 
    echo '</li>'; 
} 
+0

嗯,这很奇怪。我敢肯定,我”我已经尝试了这种方法,但没有达到预期的结果。似乎现在工作,所以我一定做了错误的事情。这比以前最快的速度快了0.05秒,但是更好的管理。 – Maurice

+0

这只是采取第二种方法,并将'array_key_exists'换成类似的功能,但更快一些'isset'。我同意,它比第一种方法更容易阅读和维护。很高兴我能帮助你 – Steve