渡されたデータを、jsonで定義された式に沿って計算を行います。
以下の形が基本形。これをexpression
と呼ぶ。expression
は複数のexpression
を子に持つとことができる。
{
"type": "type_name",
"value": "value if necessary",
"expressions": []
}
typeは、
- 値を示すもの
- constant
- variable
- 条件式
- equals
- and
- or
- morethan
- 関数
- concat
- if
- multiply
- add
- 集約
- count
- countif
- exists
- max
- sum
type
によって必要なexpressions
やvalue
は異なる。例えば、
- 条件式
equals
は二つの値を比較するため、 2つのexpression
を指定する必要がある。 - ifは、
条件式
、trueの場合の返り値
、falseの場合の返り値
の3つのexpression
が必要。 constant
やvariable
の値を表す場合はvalue
が必要。
sampleディレクトリも参照。
出庫依頼に含まれる商品の合計金額に税額を加えた金額を算出して、最後に円をつける
{
"type": "concat",
"expressions": [
{
"type": "multiply",
"expressions": [
{
"type": "sum",
"expressions": [
{
"type": "variable",
"value": "items"
},
{
"type": "multiply",
"expressions": [
{
"type": "variable",
"value": "quantity"
},
{
"type": "variable",
"value": "price"
}
]
}
]
},
1.08
]
},
"円"
]
}
$engine = Parser::parse(json_decode('JSONで書いた計算式', true));
echo $engine->evaluate([
'items' => [
['quantity' => 3, 'price' => 100],
['quantity' => 2, 'price' => 500],
]
]) . PHP_EOL;
> 1404円
itemsに、OL001-I000001が3レコード以上かつOL001-I000002を含むという条件に当てはまるかをチェック
{
"type": "and",
"expressions": [
{
"type": "morethan",
"expressions": [
{
"type": "countif",
"expressions": [
{
"type": "variable",
"value": "items"
},
{
"type": "equals",
"expressions": [
{
"type": "variable",
"value": "uid"
}, "OL001-I000001"
]
}
]
},
2
]
},
{
"type": "exists",
"expressions": [
{
"type": "variable",
"value": "items"
}, {
"type": "equals",
"expressions": [
{
"type": "variable",
"value": "uid"
}, "OL001-I000002"
]
}
]
}
]
}
$engine = Parser::parse(json_decode('JSONで書いた計算式', true));
echo $engine->evaluate([
'items' => [
['uid' => 'OL001-I000001'],
['uid' => 'OL001-I000001'],
['uid' => 'OL001-I000001'],
['uid' => 'OL001-I000002'],
]
]) . PHP_EOL;
> 1
※ expression
をオブジェクトではなく文字列・数値で指定した場合は、constant
として扱われる。
CSVの変換にexpressionを用いた例
./sample/csv_export
参照