0

次の形式のデータを含むファイルがあります。

0101    Group1  01/13/13
0102    Group1  02/03/13
0103    Group1  03/05/13
0104    Group1  04/05/13
0201    Group2  04/19/13
0202    Group2  05/10/13
0301    Group3  07/13/13
0302    Group3  07/13/13
0303    Group3  07/13/13
0401    Group4  02/12/13
0501    Group5  05/29/13

5私はグループの合計しか持っていません。ここでは、各グループを単一の文字値に置き換えようとしています。

Group1 will be replaced with A
Group2 will be replaced with B
Group3 will be replaced with C
Group4 will be replaced with D
Group5 will be replaced with E

preg_replace_callback でこれを行う方法を見つけました。

$text = preg_replace_callback('/Group[1-5]/', 'id_callback', $text);

function id_callback($matches) {
  if ($matches[0] == 'Group1') {
    return 'A';
  } elseif ($matches[0] == 'Group2') {
    return 'B';
  } elseif ($matches[0] == 'Group3') {
    return 'C';
  } elseif ($matches[0] == 'Group4') {
    return 'D';
  } elseif ($matches[0] == 'Group5') {
    return 'E';
  }
}

echo $text;

これを実行して、これらすべての if ステートメントを取り除く方法はありますか?

4

3 に答える 3

2

数学的関係は大きな助けになります。

$text = preg_replace_callback("/Group([1-5])/",function($m) {
    return chr(ord("A")+$m[1]-1);
},$text);
于 2013-10-19T20:29:45.290 に答える
2

これに対する別のアプローチは、 を使用して、見つかったすべての一致に対してコールバックを実行し、一致に配列からの値を設定associative arrayする関数を使用する傾向があります。anonymous/named

$map = array('Group1' => 'A', 'Group2' => 'B', 
             'Group3' => 'C', 'Group4' => 'D', 'Group5' => 'E');

$text = preg_replace_callback('/(?P<id>Group[1-5])/', 
      function($m) {
          global $map; 
          extract($m);
          return isset($map[$id]) ? $map[$id] : $m[0];
      }, $text);

注:読みやすくするために、正規表現を名前付きキャプチャ グループに置き換えました。

アップデート

@Niet the Dark Absolで述べたように、これはstrtrを使用してこれを実行する簡単な方法です。

$text = _replace($text);

function _replace($t) {
  $map = array('Group1' => 'A', 'Group2' => 'B', 
               'Group3' => 'C', 'Group4' => 'D', 'Group5' => 'E'
  );
  return strtr($t, $map);
}
于 2013-10-19T20:33:04.133 に答える
1

はい:

$find = array('Group1', 'Group2', 'Group3', 'Group4', 'Group5');
$replace = array('A', 'B', 'C', 'D', 'E');
$result = str_replace($find, $replace, $string);
于 2013-10-19T20:30:40.097 に答える