php中的条件preg_replace

时间:2013-07-16 11:56:40

标签: php regex

我有一个主阵列主要('质量','有效性','有效性','质量','质量','质量') 和一个具有唯一值的数组 的独特( '质量', '效能')

取决于主数组中唯一数组元素的出现,我想在主数组中为一个值附加一个整数我知道在perl中可以用一种简单的方式...

foreach $uni(@unique){
     foreach $val(@main){
          $i = 1;
         if($val eq $uni){
             $val =~ s/(.*)/$1\_$i/;
              $i ++;
         }
     }
 }

现在我期待的输出是主要的

  

( 'Quality_1', 'Effectiveness_1', 'Effectiveness_2', 'Quality_2', 'Quality_3')

我正在尝试将main中的值替换为附加的整数,因为我想维护主数组中的顺序。

请你帮我在php中做同样的事情。 这是我在php中的不完整代码:

 foreach($uni_arr as $value){
foreach($type_of_metric_main as $metric){
if($metric == $value){
    $metric = preg_replace("(.*)","$match[1]_$i",$metric);
            // Need help here
}
  }

3 个答案:

答案 0 :(得分:0)

下面是你的正则表达式,我不知道为什么你使用正则表达式,在这种情况下你可以简单地使用.运算符将后缀连接到字符串。

$metric = preg_replace("/(.*)/","$1_$i",$metric);

答案 1 :(得分:0)

即使没有正则表达式,你也可以做你想做的事。这里有一个简单的例子:

$main = array('Quality', 'Effectiveness', 'Effectiveness', 'Quality', 'Quality', 'Quality');
$unique = array('Quality', 'Effectiveness');
foreach ($unique as $unique_value) {
    $counter = 0;
    foreach ($main as $key => $value) {
        if ($value === $unique_value) {
            ++$counter;
            $main[$key] = $value . '_' . $counter;
        }
    }
}
unset($unique_value);

答案 2 :(得分:0)

首先,虽然据说Perl基于“TMTOWTDI”的原则,但语言倾向于使用Regex来解决问题。在这种情况下,我不会 "$matches[1]"也不明确。您是否希望PHP将$matches解释为var或$matches[1]?它不知道。在双引号内使用数组时,您应该使用花括号来表示清晰度:"{$matches[1]}_$i"。也就是说,preg_*函数不会创建$matches数组,而是定期反向引用。你的意思是"$1_$i"。但除此之外,下面是一个更高效的方法(没有正则表达式,没有嵌套循环):

在PHP中也不是那么难。更重要的是,它甚至不需要嵌套循环。

$main = array('Quality','Effectiveness','Effectiveness','Quality','Quality','Quality');
$unique = array_unique($main);
$count = array_fill_keys($unique, 1);//init all counts to 1
foreach($main as $key => $val)
{
    if ($count[$val])
    {//can be left out, if the unique array is produced by an array_unique call
        $main[$key] .= '_'.$count[$val];//append counter
        $count[$val]++;//increment count
    }
}
print_r($main);

就是这样。您可以使用foreach构造并通过引用迭代主数组:

$count = array_fill_keys($unique, 0);//init to 0
foreach($main as &$val)
{
    $count[$val]++;//increment, before changing $val
    $val .= '_'.$count[$val];
}