2010-12-12 54 views
0

J'ai écrit ceci:Comment ajouter opérateur aléatoire de tableau dans PHP

$num1 = mt_rand(1,5); 
$num2 = mt_rand(1,5); 

$operators = array(
    "+", 
    "-", 
    "*", 
    "/" 
    ); 

$result = $num1 . $operators[array_rand($operators)] . $num2; 

(Ma meilleure estimation est) Cela ne fonctionne pas comme je m'y attendais, car dans le tableau de l'opérateur est une chaîne qui fait tout un chaîne:

var_dump($result); 

donne:

string(3) "4+3" 

ma question serait de savoir comment recommanderiez-vous aborder ce * sans changer de l ogic ça trop?

Merci d'avance !! * Opération aléatoire parmi des nombres aléatoires, et si possible, les opérateurs doivent être stockés dans un tableau.


J'ai le sentiment que mon titre ne décrit pas correctement la situation, mais je ne pouvais pas trouver une meilleure idée, je suis ouvert aux suggestions :)

Répondre

3

Bien sûr, vous pouvez utiliser eval pour ce faire, mais je ne vais certainement pas me contenter d'une telle solution.

Je suggère de définir un tas de fonctions qui prennent deux paramètres et renvoient un résultat, puis utilisez call_user_func_array sur le résultat de array_rand.

function add($x, $y) { return $x + $y; } 
function subtract($x, $y) { return $x - $y; } 
function multiply($x, $y) { return $x * $y; } 
function divide($x, $y) { return $x/$y; } 

$operators = array('add', 'subtract', 'multiply', 'divide'); 
//... 
$result = call_user_func_array($operators[array_rand($operators)], array($x, $y)); 
+0

merci! ça a l'air vraiment bien !! pour une raison quelconque, je ne suis pas encore convaincu avec les réponses de changement. – Trufa

+0

@Akinator, en effet. J'essaie d'éviter d'utiliser l'instruction 'switch'. –

0

Créer une fonction pour chaque opération, puis store operator => nom de la fonction dans un tableau.

+0

Je vais essayer! Merci! – Trufa

2
<?php 

$num1 = mt_rand(1, 5); 
$num2 = mt_rand(1, 5); 

$operators = array(
    "+", 
    "-", 
    "*", 
    "/" 
); 

switch ($operators[array_rand($operators)]) { 
    case "+": 
     $result = $num1 + $num2; 
     break; 
    case "-": 
     $result = $num1 - $num2; 
     break; 
    case "*": 
     $result = $num1 * $num2; 
     break; 
    case "/": 
     $result = $num1/$num2; 
     break; 
} 

var_dump($result); 
+0

putain me battre par une seconde ... –

+0

Ok, je l'aime (surtout parce qu'il résout en fait le problème) mais n'est-ce pas un peu redondant? – Trufa

+0

@Akinator Non, [commutateur] (http://php.net/manual/fr/control-structures.switch.php) n'est pas redondant. –

2

La solution propre serait d'avoir une branche de code pour chaque opérateur, par exemple,

function do_something($num1, $num2, $operator) { 
    switch ($operator) { 
    case '+': 
     return $num1 + $num2; 
    case '-': 
     return $num1 - $num2; 
    case '*': 
     return $num1 * $num2; 
    case '/': 
     return $num1/$num2; 
    default: 
     throw new Exception('Unknown operator: '.$operator) 
    } 
} 

Si vous avez plus d'opérateurs, vous devez créer une carte de operator => function et appeler dynamiquement les fonctions, par exemple:

$ftable = array(
    '+' => 'fn_add', 
    '-' => 'fn_sub', 
    '*' => 'fn_mul', 
    '/' => 'fn_div' 
); 

function fn_add($a, $b) { return $a + $b; } 
function fn_sub($a, $b) { return $a - $b; } 
function fn_mul($a, $b) { return $a * $b; } 
function fn_div($a, $b) { return $a/$b; } 

function do_something($num1, $num2, $operator) { 
    global $ftable; 
    if (array_key_exists($operator, $ftable)) { 
    return call_user_func($ftable[$operator], $num1, $num2); 
    } 
    else { 
    throw new Exception('Unknown operator: '.$operator) 
    } 
} 

Et bien sûr, la solution impure (lente, potentiellement dangereux) serait utiliser eval().

+0

eval() est evil(). Ok, je ne sais pas pourquoi je ne suis pas sûr de ça (bien sûr, cela résout le problème, merci) mais je vais voir où ça va. – Trufa

+0

Vous avez absolument raison, 'eval()' est diabolique. Ainsi, je recommande de ne pas l'utiliser. :) – moeffju

+0

J'ai étendu ma réponse avec un exemple de carte de répartition. Vous pouvez également utiliser ''+' => create_function (...)' ou, dans les nouvelles versions de PHP, ''+' => function ($ a, $ b) {return $ a + $ b; } '. Et vous devriez utiliser des classes et non des globals ...:) – moeffju