如果条件动态创建PHP

时间:2019-04-06 20:50:03

标签: php if-statement

我有一个表单,其中有多个字段可供用户搜索。如何根据用户选择的字段动态编写if条件?

例如我有3个字段,如下所示:

$categoryId = $_REQUEST['category_id'];
$locationId = $_REQUEST['location_id'];
$statusId = $_REQUEST['status_id'];

如果用户选择了category_id,location_id和status_id,那么我的if语句将如下所示:

if (!empty($categoryId) && !empty($locationId) && !empty($statusId)) {
  if (isInTaxonomy($recordId, $categoryId) && isInTaxonomy($recordId, $locationId) && isInTaxonomy($recordId, $statusId) {
    // Do something
  }
}

如果用户选择category_id和location_id,则我的if statmeent如下:

if (!empty($categoryId) && !empty($locationId)) {
  if (isInTaxonomy($recordId, $categoryId) && isInTaxonomy($recordId, $locationId) {
    // Do something
  }
}

如果用户仅选择category_id,则我的if statmeent如下:

if (!empty($categoryId)) {
  if (isInTaxonomy($recordId, $categoryId)) {
    // Do something
  }
}

如您所见,我必须实现用户可以选择的所有可能的字段组合来构建所有不同的条件。

我当时正在考虑做以下事情,但这只是给我一个字符串,我不想使用eval来执行它:

$filter = [(!empty($categoryId) ? '(isInTaxonomy($recordId, $categoryId))' : ''),
         (!empty($locationId) ? '(isInTaxonomy($recordId, $locationId))' : '')];

$condition = implode(' && ', array_filter($filter));

if (eval("return $condition;")) {
   // Do something
}

是否有一种方法可以使用更简洁的代码动态生成所有条件,而不必求助于Eval?

3 个答案:

答案 0 :(得分:1)

我假设您可以使用以下方法-定义可用的密钥并在它们上进行迭代,而在进行迭代时-收集一些数据,例如:

$keys = ['category_id', 'location_id', 'status_id'];

$operationAllowed = true;
foreach ($keys as $key) {
    if (!empty($_REQUEST[$key])) {
        $operationAllowed = $operationAllowed && isInTaxonomy($recordId, $_REQUEST[$key]);
    }
}

答案 1 :(得分:0)

您可以将它们添加到数组中并使其循环(或将它们保留在数组中并在那里循环)。

viewDidLayoutSubviews

因为我使用array_filter,所以它不会测试将返回false的空值。

我重新考虑了代码。
如果三个都为空,那么我之前的代码将返回true,这是错误的(我想)。
因此,我改为从false语句开始,然后将true / false添加到数组中,然后在循环之后查看是否使用array_diff获得了任何false返回值。
Array_diff将删除所有true,如果返回数组具有任何值,则循环中至少有一个值为false。

答案 2 :(得分:-1)

计算结果相同:

$categoryId = $_REQUEST['category_id'];
$locationId = $_REQUEST['location_id'];
$statusId = $_REQUEST['status_id'];

if( (empty($categoryId) || isInTaxonomy($recordId, $categoryId)) &&
    (empty($locationId) || isInTaxonomy($recordId, $locationId)) &&
    (empty($statusId)   || isInTaxonomy($recordId, $statusId))) {
    // Do Something
}

它由行分隔,每个变量都是一行。如果变量为空,则行求值为true(不检查isInTaxonomy),然后继续执行下一个,如果变量不为空,则检查第二个条件,isInTaxonomy为评估后,如果是true,则验证继续到下一行;如果是false,则验证停止。


编辑:您也可以在for循环上使用此方法

$args = ['category_id', 'location_id', 'status_id'];

$valid = true;
foreach ($args as $arg) {
    $valid &= empty($_REQUEST[$arg]) || isInTaxonomy($recordId, $_REQUEST[$arg]);
}

if($valid) {
    // Do Something
}