1

我有一个主数组main('Quality','Effectiveness','Effectiveness','Quality','Quality','Quality' ) 和一个具有唯一值的数组 unique('Quality','Effectiveness')

根据主数组中唯一数组元素的出现,我想将一个整数附加到主数组中的值我知道它可以在 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.ini 中做同样的事情吗?这是我在 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
}
  }
4

3 回答 3

0

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

$metric = preg_replace("/(.*)/","$1_$i",$metric);
于 2013-07-16T11:59:49.993 回答
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);
于 2013-07-16T12:11:48.563 回答
0

首先,虽然 Perl 据说是基于“TMTOWTDI”的原理,但该语言倾向于发展出用正则表达式解决问题的偏好。不过,在这种情况下,我不会。
也是"$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];
}
于 2013-07-16T12:15:21.253 回答