0

JSON応答リクエストがあり、1つの変数を作成したい$ Where、これはJSONパターンです:

"filter":
{"filters":[
    {"logic":"and","filters":[
        {"field":"NAMA","operator":"eq","value":"Rahmat"},
        {"field":"NAMA","operator":"eq","value":"Rosadi"}
    ]},{"logic":"or","filters":[
        {"field":"NIPK","operator":"eq","value":"1919191919"},
        {"field":"NIPK","operator":"eq","value":"818181818181"}
    ]},{"logic":"and","filters":[
        {"field":"JK","operator":"eq","value":"P"},
        {"field":"JK","operator":"eq","value":"L"}
    ]}
],
"logic":"and"}

誰かがこのように単一行のPHP変数をパターン化する方法を教えてもらえますか?

$Where = "(NAMA = 'Rahmat' or NAMA = 'Rosadi') and (NIPK = '1919191919' or NIPK != '818181818181') and (JK='P' AND JK='L')"

英語が下手でごめんなさい。

4

1 に答える 1

1

リストをPHP配列に列挙し、filtersそれぞれをSQL OR値のリストとして作成してから、implode(' OR ', ...);で結合することができます。さらに、'AND'句のリストに配列を組み込みます。

ただし、このアプローチでは、JSONセットアップで許可されている柔軟性の多くが失われます。これは、 -clausesまたはsingle句のAND-listに拡張でき、構文を使用して同じフィールドの句を合体させることもできますが、それ以上のことはできません。ORORIN

RPN表記から代数に変換するアルゴリズムを調べて、より強力な(より複雑ではありますが)アプローチを探すことができます。

シンプルなバージョンは

$ops = array(
    'eq' => '=',
    'ne' => '!=',
    'gt' => '>',
    'lt' => '<',
    'ge' => '>=',
    'le' => '<=',
    // CHECK THIS OUT, FIX & COMPLETE
);

$arr_Filters = array();
foreach($filters as $filter)
{
    /* $filter is a set of subfilters:
       {"logic":"and","filters":[
          {"field":"NAMA","operator":"eq","value":"Rahmat"},
         {"field":"NAMA","operator":"eq","value":"Rosadi"}
       ]},
       which we see as:
    */
    $logic = $filter['logic'];
    $arr_Filter  = array();
    foreach($filter['filters'] as $fov)
    {
        $op_f = $fov['operator'];
        $op   = $ops[$op_f];
        $value = /* FUNCTION TO SQL ESCAPE A VALUE */ $fov['value'];
        $value = is_numeric($value) ? $value : "'".$value."'";
        $arr_Filter[] = "$fov[field] $op $value";
    }
    $arr_Filters[] = '('.implode(' ' . $filter['logic'] . ' ', $arr_Filter).')';
}
$sql_filter = 'WHERE ' . implode(' AND ', $arr_Filters);

次のように操作できるオブジェクトを使用json_decode()して取得できます。

// ($ops omitted, same as above)

$arr_Filters = array();
foreach($filters->filter->filters as $filter)
{
    /* $filter is a set of subfilters:
       {"logic":"and","filters":[
          {"field":"NAMA","operator":"eq","value":"Rahmat"},
         {"field":"NAMA","operator":"eq","value":"Rosadi"}
       ]},
       which we see as:
    */
    $logic = $filter->logic;
    $arr_Filter  = array();
    foreach($filter->filters as $fov)
    {
        $op_f = $fov->operator;
        $op   = $ops[$op_f];
        $value = /* FUNCTION TO SQL ESCAPE A VALUE */ $fov->value;
        $value = is_numeric($value) ? $value : "'".$value."'";
        $arr_Filter[] = "{$fov->field} $op $value";
    }
    $arr_Filters[] = '('.implode(' ' . $filter->logic . ' ', $arr_Filter).')';
}
$sql_filter = 'WHERE ' . implode(' ' . $filters->filter->logic . ' ', $arr_Filters);
于 2012-09-17T13:42:26.817 に答える