我有JSON响应请求,想要从其中创建一个变量$ 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')"

对不起,我的英语不好。

#1楼 票数:1 已采纳

您可以将filters列表枚举为PHP数组,将每个filters列表构建为SQL OR值列表,然后将它们与implode(' OR ', ...) 并在'AND'子句列表中内嵌该数组。

但是,这种方法失去了JSON设置所允许的许多灵活性。 它可以扩展到AND任-list OR -clauses或单条款,并可能合并OR条款使用相同的字段IN的语法,但没有更多。

您可以查看从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);

  ask by Rizky Hajar translate from so

未解决问题?本站智能推荐:

2回复

将php对象转换为json

我有一个php对象,我想将其转换为以下json格式。 所有data值都是通过php对象提供的,格式为: 我正在尝试将credit, caption等归入“ child类别。 另外,我无法以json格式获取[之后的date 。 目前,我的代码如下所示:
4回复

将PHP数组转换为Json对象

我有以下问题: 我有一个PHP数组看起来像这样: 现在,如果我在此数组上使用json_encode,则会得到以下结果: 但是,我试图获得以下输出: 我该怎么做? 我已经阅读了很多类似的问题,我使用他们的答案来说明这一点,但是我没有找到解决此问题的方法。 在此先多谢!
3回复

将php字符串转换为json对象[重复]

这个问题在这里已经有了答案: 如何使用 PHP 从 JSON 中提取数据? (7 个回答) 去年关闭。 我在数据库中有一个字符串,它实际上
3回复

PHP:将字符串转换为json数组[重复]

这个问题在这里已经有了答案: PHP:为一组 JSON 对象命名? (5 个回答) 1 年前关闭。 我需要转换这个字符串 进入这个jso
1回复

如何使用php从json文件将数组转换为ArrayObject

我有来自外部 json 文件的数组数据。 数据如下所示[{"serial": 991, "name": "hello"},{"serial": 993, "name": "world"},{"serial": 994, "name": "island"}] 我怎样才能把上面的数据转换成下面的例子ar
1回复

PHP数组转换为JSON:尝试获取非对象错误的属性

当我尝试从转换为JSON的数组中获取值时,我正在“尝试获取非对象的属性”。 Utils.php片段: 的片段System.php : Game.php片段: Config.php有点像: 就是说错误与System.php中$ this-> config的每次使用有关。
1回复

如何将JSON字符串转换为PHP对象或数组创建*code*[重复]

这个问题已经在这里有了答案: 打印一个数组作为代码 4个答案 首先:这是一个完全不同的问题- 如何将JSON字符串转换为数组 我的问题... 我有一个有效的JSON字符串分配给php变量$json 。 我知道我可以将其运行到json_decode($json, tr
1回复

如何将json响应转换为php中的可调用对象?

我正在尝试将$response变量中下面的 json 响应转换为可调用函数,如$response->getStatus()以便它可以返回failed 。 这是回应 我发现了一些关于使用 LazyJsonMapper 的信息。 请问我该怎么办。 谢谢