多维数组替换中的PHP效率

时间:2016-07-15 10:41:03

标签: php arrays

我有一种情况,我需要遍历各种XML文档并用xPath替换某些值。到目前为止一切都那么好,但我使用的方法感觉不对(但它起作用,至少是某种东西)。

我所做的是为每个替换类型创建一个多维数组(为了使其易于管理),并使用其替换。然后我循环遍历这些数组并将值推送到单独的数组,我用它来替换值。像这样:

 $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秒(通过比较文档顶部和底部的微量时间来衡量)。因为源XML文件可以变得更大,我希望代码尽可能高效和manable

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

1 个答案:

答案 0 :(得分: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>';
}