web-dev-qa-db-fra.com

php switch instruction de cas pour gérer les gammes

J'analyse du texte et calcule le poids en fonction de certaines règles. Tous les personnages ont le même poids. Cela rendrait l'instruction switch très longue, puis-je utiliser des plages dans l'instruction case?.

J'ai vu l'une des réponses préconisant les tableaux associatifs.

$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;

Quelle est la meilleure façon de réaliser quelque chose comme ceci? solution élégante ou est-ce la seule alternative?

35
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;

* UPDATE: avec la valeur par défaut *

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

Eh bien, vous pouvez avoir des plages dans l'instruction switch comme:

//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;
}
137
Sudhir Bastakoti

Vous pouvez spécifier la plage de caractères à l'aide d'une expression régulière. Cela évite d’écrire une très longue liste de cas de commutation. Par exemple,

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

Je pense que je le ferais d'une manière simple.

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