2010-12-02 6 views
0

Ich möchte eine Funktion schreiben, die Formeln verarbeitet, die aus Array-Schlüssel bestehen. Zum Beispiel (1 + 3 + 5 + 7-8) * 9 oder (1-3 + 5)/6 und usw. Irgendwelche Vorschläge?Verarbeitung einer Formel bestehend aus Array-Schlüsseln in PHP

EDIT: Ich denke, es ist besser, dies als ein Excel Raster zu denken, koordiniert mit Feld, um die Array-Tasten und eines des Feldes ist das Formelfeld sein (zB A1 + A2-B2 * B3)

+2

sagen Sie, dass einer Ihrer Array-Schlüssel "(1 + 3 + 5 + 7-8) * 9" ist? – Mala

+0

Warum ?????????????????? –

+0

@Mala, sorry, hätte klarer sein müssen. Jede der Nummern ist ein Array-Schlüssel. – pistolshrimp

Antwort

1
 


function convert_formula($formula, $formula_array) { 
    $callback = function($matches) use ($formula_array) {return $formula_array[(int) $matches[0]];}; 
    $converted = preg_replace_callback("/[0-9]+/", $callback, $formula); 
    return eval("return $converted;"); 
    } 

$test_formula = '(3-1) * (3-10)'; 
$test_formula_array = array(323,67,82,56, 10 => 3); 

echo convert_formula($test_formula, $test_formula_array); 



Benötigt PHP 5.3. + Für Anon-Funktionen. Sie sollten zuerst das $ formula-Argument validieren, um sicherzustellen, dass es nur Zahlen und mathematische Symbole akzeptiert, bevor Sie es in der Funktion auswerten.

Edit: nur mit der Annahme, dass dies ein Werkzeug ist, um Studenten auf Mathematik zu unterweisen, und dass Sie bereits einen vordefinierten Satz von Formeln zu referenzieren ... als eval ist eine der gefährlichsten Funktionen von PHP, Vielleicht möchten Sie diese Clientseite mit Javascript ausführen. Wenn Sie die Seite erstellen, erstellen Sie einfach ein Basis-JavaScript-Referenzarray mit allen möglichen Werten, die in der Formel verwendet werden. Auf diese Weise erstellt und löst der Client mit der eval-Funktion von javascript die Formel an ihrem Ende. Diese abschließende Bewertung wird dann an Ihren Server zurückgegeben, der dann die Bewertung validiert und eine endgültige "richtige/falsche" Antwort gibt. Nur ein Gedanke ...

+0

Danke Herr. Zerstörer. Es funktioniert super! Ich bin mir der Eval Evil bewusst und der Javascript Eval Ansatz war genau das, was ich geplant habe. Da ich in js (noch) nicht sehr versiert bin, dachte ich, dass es einfacher für mich ist, die Formel in PHP zu bekommen. – pistolshrimp

+0

@pistolshrimp: Gern geschehen. Es wird einige Probleme geben, die diese Funktion auf JavaScript portieren, wie zB kein 'use'-Schlüsselwort, um eine Variable aus dem übergeordneten Bereich automatisch in den lokalen Bereich der anon-Funktion zu importieren. Hier ist eine SO Frage zu Javascript Anon-Funktionen, die hier helfen: http://StackOverflow.com/Questions/1140089/how-does-ananonymous-Function-in-JavaScript-work. Auch keine 'preg_replace_callback'-Funktion, daher wird dort eine Abhilfe benötigt. –

1

Okay, dieses funktioniert wirklich.

$input = '0 + 1 + 2 + 3'; 
$input = preg_replace('/[^0-9\/\+\-\*]/', '', $input); 

$array = array(23, 40, 6, 200); 

function getAtIndex($i) { 
    global $array; 
    return isset($array[$i[0]]) ? $array[$i[0]] : 0; 
} 

$output = preg_replace_callback('/[0-9]+/', 'getAtIndex', $input); 

eval('$output = ' . $output . ';'); 

Bearbeiten: jetzt reinigt Eingabe.

+0

Bron: Obwohl dein anderes Beispiel nicht über 9 hinausgehen würde, war die Verwendung von 'str_replace' immer noch ziemlich erfinderisch. –

+0

Bron, vielen Dank. Ich werde das auch versuchen. – pistolshrimp

+0

@ bob-the-destroyer: Ich habe es noch nicht getestet, aber ich glaube es würde. Beachten Sie das '+' im regulären Ausdruck. Hast du es getestet? – Jonah

Verwandte Themen