【问题标题】:Dynamically create PHP if condition动态创建 PHP if 条件
【发布时间】:2019-04-06 20:50:03
【问题描述】:

我有一个用户可以搜索的包含多个字段的表单。如何根据用户选择的字段动态编写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?

【问题讨论】:

    标签: php if-statement


    【解决方案1】:

    我认为您可以使用以下方法 - 定义可用键并对其进行迭代,同时迭代 - 收集一些数据,例如:

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

    【讨论】:

    • && 在下面的行 `$operationAllowed = $operationAllowed && 因为它不起作用做了什么?
    • 这只是其中一种方法,你加入isInTaxonomy的结果。因此,无论您在某些isInTaxonomy 调用中得到false,都将不允许操作。你可以做其他事情——比如将正确的项目存储在数组或其他任何东西中。
    【解决方案2】:

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

    $categoryId = $_REQUEST['category_id'];
    $locationId = $_REQUEST['location_id'];
    $statusId = $_REQUEST['status_id'];
    // This can be done in different ways, I kept your "style" since you may have other reasons to extract the values
    $arr =[$categoryId, $locationId, $statusId];
    
    $arr = array_filter($arr); // remove empty values
    $return[] = false; // set 0 key to false. First iteration will overwrite it
    foreach($arr as $key => $val){
        if (isInTaxonomy($recordId, $val)) {
             $return[$key] = true;
        }
    }
    
    if(array_diff($return, [true])) {
        // Don't do something (?)
    }else{
        // Do something
        // (All is true)
    } 
    

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

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

    【讨论】:

    • 那么我在哪里添加代码来做某事 - 是在 if 语句之后的 foreach 块中吗?
    • 返回会告诉你是否应该做某事。
    • @adam78 我不知道你是否注意到了,但几个小时前我对我的回答做了相当大的改变。
    【解决方案3】:

    这会得出相同的结果:

    $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,如果它是@987654325 @,验证继续到下一行,如果是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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2013-05-17
      相关资源
      最近更新 更多