2010-03-31 5 views
4

Étant donné cet exemple, comment retourner le résultat de l'équation plutôt que l'équation elle-même en tant que chaîne?Opérateurs variables en PHP

$operator = '+'; 
foreach($resultSet as $item){ 
    $result = $item[$this->orderField] . $operator . 1; 
    echo $result; 
} 
+1

Quel est le cas réel qui vous a amené à cette question? –

+0

Je devais échanger des éléments dans un tableau mais conserver leurs clés et leurs valeurs. $ item [$ this-> orderField] serait l'item courant, +/- 1 serait l'item avec lequel il échangerait ses positions. J'ai écrit une fonction array_swap, et combinée avec la méthode de reko_t elle produit quelque chose de similaire à array ([1] => '1', [0] => '0', [2] => '2') de array ([ 0] => '0', [1] => '1', [2] => '2'). – BenTheDesigner

Répondre

17

Vous pouvez faire des fonctions qui enveloppent les opérateurs, ou la simplicité il suffit d'utiliser l'extension bc:

$operator = '+'; 
$operators = array(
    '+' => 'bcadd', 
    '-' => 'bcsub', 
    '*' => 'bcmul', 
    '/' => 'bcdiv' 
); 

foreach($resultSet as $item){ 
    $result = call_user_func($operators[$operator], $item[$this->orderField], 1); 
    echo $result; 
} 
+4

+1 pour éviter 'eval' – Matt

+0

+1 - Acclamations reko_t. – BenTheDesigner

+1

Utilisez une bibliothèque mathématique de précision arbitraire pour effectuer des opérations mathématiques régulières? Cela ressemble un peu excentrique ... –

2

Vous pouvez utiliser eval(), mais il est généralement une mauvaise idée, car il est un trou important potentiel de sécurité (attention, vous n'êtes pas permettant aux visiteurs d'exécuter du code arbitraire!).

Il peut également résulter un code difficile à maintenir.

1

Utilisez la fonction eval de PHP: http://php.net/manual/en/function.eval.php

$operator = '+'; 
foreach($resultSet as $item){ 
    $result = $item[$this->orderField] . $operator . 1; 
    eval("\$result = \"$result\";"); 
    echo $result; 
} 
2

réponse rapide est eval(). Cependant, dans cet exemple précis, je voudrais juste coder en dur les opérations possibles:

6

Pour réaliser exactement cela, vous pouvez utiliser create_function

$operator = '+'; 
$func = create_function('$a,$b', "return \$a $operator \$b;"); 
foreach($resultSet as $item){ 
    $result = $func($item, 1); 
    echo $result; 
} 

Une solution plus propre est possible avec lambdas (PHP5.3 requis)

$func = function($a, $b) { return $a + $b; }; 
foreach($resultSet as $item){ 
    $result = $func($item, 1); 
    echo $result; 
} 

Voir aussi array_sum, array_reduce

Exemple avancé avec array_reduce et lambdas

$ary = array(
    array('foo' => 1, 'bar' => 91), 
    array('foo' => 2, 'bar' => 92), 
    array('foo' => 3, 'bar' => 93), 
    array('foo' => 4, 'bar' => 94), 
    array('foo' => 5, 'bar' => 95), 
); 

$sumOfFoos = array_reduce($ary, 
    function($val, $item) { return $val + $item['foo']; } 
); 
$sumOfBars = array_reduce($ary, 
    function($val, $item) { return $val + $item['bar']; } 
); 

Le point principal est que, au lieu des « opérateurs variables » (ce qui est impossible en PHP), vous devriez plutôt utiliser des fonctions variables (ce qui est possible et beaucoup plus flexible) .

+1

+1 mais 'create_function()' sera toujours 'eval()' votre code – Andy

+1

il va évaluer mon _code_ mais pas _variables_, ce qui est la différence clé. – user187291

+0

Mais l'opérateur $ est aussi une variable arbitraire, ou vous n'avez pas besoin de créer \ _function (comme dans la réponse de reko \ _t), n'est-ce pas? – VolkerK