2011-04-25 22 views
9

Decir que tengo una cadena, $char. $char == "*".PHP utilización cadena como operador

También tengo dos variables, $ a y $ b, que equivalen a "4" y "5", respectivamente.

¿Cómo consigo el resultado de $a $char $b, ie 4 * 5 ?

Gracias :)

Respuesta

14

Puede utilizar eval() según lo sugerido por @konforce, sin embargo, la ruta más segura sería algo así como:

$left = (int)$a; 
$right = (int)$b; 
$result = 0; 
switch($char){ 

    case "*": 
    $result = $left * $right; 
    break; 

case "+"; 
    $result = $left + $right; 
    break; 
// etc 

} 
+0

esa es la respuesta que estaba buscando :) – felamaslen

+0

Me alegro de poder ayudar :) ¡Buena suerte! –

6

El método más sencillo pero más peligroso es utilizar eval.

$c = eval("return $a $char $b;"); 
+2

pero evite eval. –

+1

@Shakti, evitaría 'eval' para el código de producción también. – Matthew

+0

Prefiero no usar eval como los valores provienen de la entrada del usuario. – felamaslen

1

echar un vistazo a la función eval(). necesitarás construir un comando php apropiado y ejecutar dentro de eval() para extraer el resultado.

1

que puede hacer con eval sin embargo, no se recomienda usar eval.

Si hay operador caso puede por cualquier cosa que debe comprobar qué operador es antes de usar

switch($char) 
{ 
    case '*': 
    $result= $a * $b; 
    break; 

    case '+': 
    $result= $a + $b; 
    break; 
} 
+0

Sí, voy a ir con esa opción. Gracias :) – felamaslen

7

método más seguro es una construcción switch:

function my_operator($a, $b, $char) { 
    switch($char) { 
     case '=': return $a = $b; 
     case '*': return $a * $b; 
     case '+': return $a + $b; 
     etc... 
    } 
} 
+0

sí ... ¡la gente responde demasiado rápido! – felamaslen

+2

si el operador es '=' su código producirá 'suma 'de operandos. ¿No debería haber un "descanso"? –

+0

El '=' no haría nada en este caso, a menos que $ a se haya pasado como referencia. La asignación se perderá tan pronto como la función regrese, de lo contrario. Es solo un ejemplo. –