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')

メイン配列のように順序を維持したいので、メインの値を追加された整数に置き換えようとしています。

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
}
  }
4

3 に答える 3

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

以下は正規表現です。この場合、.演算子を使用してサフィックスを文字列に単純に連結できるのに、正規表現を使用する理由がわかりません。

$metric = preg_replace("/(.*)/","$1_$i",$metric);
于 2013-07-16T11:59:49.993 に答える
0

まず、Perlは「TMTOWTDI」の原則に基づいていると言われていますが、言語はRegexで物事を解決することを好む傾向があります。この場合、私はしません。
また"$matches[1]"曖昧です。$matchesPHP に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 に答える