0

私は少し行き詰まっていて、PHPに精通している誰かが私を助けてくれることを願っています。基本的に私は、XMLファイルを介して製品をプラグインできるPHPアプリケーションを作成しています。私が製品と言うとき、私はレンタカーや保険タイプの製品のように意味します。そこでは、記入するフォームと計算するレートがあります。基礎となるクラスがすべての作業を行うため、コーディングの知識がなくても、将来的に新しいものを追加したり、それらを適応させたりするのを容易にするために、XML構造を選択しました。しかし、私は現在、悪用されるリスクなしに、XMLファイル構造にレート計算を含めてPHPで評価するための最も安全で最良の方法を模索しています。たとえば、レート計算領域に使用するxmlファイル構造は次のようになります。

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">[variable1] * [variable2]</rate>
</rates>

これはかなり基本的な例ですが、私のクラスは名前を読み取り、xmlパーサーを使用してこれに基づいてphp変数を作成し、値をフォーム(または親戚が参照している場所)で指定します。計算タイプを見つけて、正しく名前が付けられた変数(角括弧などで示されている)を計算にプラグインして評価します。したがって、この例では、計算を解析することによって得られる出力は次のようになります。

$variable1 * $variable2

次に、calculatedvariable1の値を取得するために、これを計算として実行する必要があります。これを達成するためにeval()を使用できることはわかっていますが、これが唯一のオプションであるとは確信していません。おそらく、xml構造で、またはphpが解析する方法で実行できる他の何かが欠落しています。とにかく、私はそれをきちんと説明したことを望みます、そしてどんな考えでも前もって感謝します。

4

1 に答える 1

2

属性に基づく文字列の形式で既にフォームから値を取得するという問題を解決したことを考慮して、relativeここで実装に名前を付けますresolve_variable($relative)

次に、要素自体に値を割り当て、次のような標準の xpath 1.0 式の形式で計算を定式化できます。

rate[@name="variable1"] * rate[@name="variable2"]

そして、XML 内のその式:

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">
    rate[@name="variable1"] * rate[@name="variable2"]
  </rate>
</rates>

PHP で必要なのは、次のDOMXPath目的でオブジェクトを使用することだけDOMDocumentです。

$dom = new DOMDocument();
$dom->loadXML($xml); 
$xpath = new DOMXPath($dom);

その後、値をノードに割り当てることができます。

// assign values
foreach ($xpath->query('rate/@relative') as $relative) {
    $relative->ownerElement->nodeValue = resolve_variable($relative);
}

次に、すべての計算を実行します。

// do calculations
$results = array();
foreach ($xpath->query('rate[@type="calculation"]') as $calculation) {
    $results[$calculation->getAttribute('name')]
        = $xpath->evaluate($calculation->nodeValue);
}

次に、配列の形式でうまく出力されます$results(私の例では、値として 3 と 5 があります)。

Array
(
    [calculatedvariable1] => 15
)

多分これはあなたにとって役に立ちます。

正確な計算が必要な場合は、浮動小数点演算が邪魔になる可能性があることに注意してください http://www.validlab.com/goldberg/paper.pdf

全体像/上からのビューの一目でわかる実際の例: http://eval.in/9595

XSLを使用してこれを行うこともできます。

于 2013-02-12T14:31:03.820 に答える