PHP 多维数组替换的效率
PHP efficiency in multidimensional array replacements
我有一种情况需要遍历各种 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 文件可以变得更大,所以我希望代码尽可能高效 和可管理 。
然而,第二种方法 'feels' 好多了,尽管我无法忍受(显然)效率低下。我希望任何人都可以向我保证其中一种方法很好,或者为我指明正确的方向以使其真正有效。会很好! :)
您可以简单地使用您的 $region_replacements
数组作为查找 table,如果没有找到结果,则回显原始术语:
$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>';
}
我有一种情况需要遍历各种 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 文件可以变得更大,所以我希望代码尽可能高效 和可管理 。
然而,第二种方法 'feels' 好多了,尽管我无法忍受(显然)效率低下。我希望任何人都可以向我保证其中一种方法很好,或者为我指明正确的方向以使其真正有效。会很好! :)
您可以简单地使用您的 $region_replacements
数组作为查找 table,如果没有找到结果,则回显原始术语:
$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>';
}