web-dev-qa-db-ja.com

範囲を処理するphp switch caseステートメント

テキストを解析し、いくつかのルールに基づいて重みを計算しています。すべてのキャラクターの体重は同じです。これにより、caseステートメントで範囲を使用できる場合、switchステートメントが非常に長くなります。

連想配列を提唱する回答の1つを見ました。

$weights = array(
[a-z][A-Z] => 10,
[0-9] => 100,
['+','-','/','*'] => 250
);
//there are more rules which have been left out for the sake of clarity and brevity
$total_weight = 0;
foreach ($text as $character)
{
  $total_weight += $weight[$character];
}
echo $weight;

このようなことを達成する最良の方法は何ですか? PHPのbash caseステートメントに似たものはありますか?連想配列またはswitchステートメントのいずれかで個々の文字を書き留めることは、最もエレガントな解決策になることはできませんか、それが唯一の選択肢ですか?

37
nikhil
$str = 'This is a test 123 + 3';

$patterns = array (
    '/[a-zA-Z]/' => 10,
    '/[0-9]/'   => 100,
    '/[\+\-\/\*]/' => 250
);

$weight_total = 0;
foreach ($patterns as $pattern => $weight)
{
    $weight_total += $weight * preg_match_all ($pattern, $str, $match);;
}

echo $weight_total;

* PDATE:デフォルト値*を使用

foreach ($patterns as $pattern => $weight)
{
    $match_found = preg_match_all ($pattern, $str, $match);
    if ($match_found)
    {
        $weight_total += $weight * $match_found;
    }
    else
    {
        $weight_total += 5; // weight by default
    }
}
2
akond

さて、switchステートメントには次のような範囲を含めることができます。

//just an example, though
$t = "2000";
switch (true) {
  case  ($t < "1000"):
    alert("t is less than 1000");
  break
  case  ($t < "1801"):
    alert("t is less than 1801");
  break
  default:
    alert("t is greater than 1800")
}

//OR
switch(true) {
   case in_array($t, range(0,20)): //the range from range of 0-20
      echo "1";
   break;
   case in_array($t, range(21,40)): //range of 21-40
      echo "2";
   break;
}
149

正規表現を使用して文字範囲を指定できます。これにより、非常に長いスイッチケースリストを作成する必要がなくなります。例えば、

function find_weight($ch, $arr) {
    foreach ($arr as $pat => $weight) {
        if (preg_match($pat, $ch)) {
            return $weight;
        }   
    }   
    return 0;
}

$weights = array(
'/[a-zA-Z]/' => 10, 
'/[0-9]/'    => 100,
'/[+\\-\\/*]/'   => 250 
);
//there are more rules which have been left out for the sake of clarity and brevity
$total_weight = 0;
$text = 'a1-';
foreach (str_split($text) as $character)
{
  $total_weight += find_weight($character, $weights);
}
echo $total_weight; //360
1
Arrix

私はそれを簡単な方法でやると思います。

switch($t = 100){
    case ($t > 99 && $t < 101):
        doSomething();
        break;
}
0
Pedro Mora