【问题标题】:check if condition and append string multiple times检查条件并多次附加字符串
【发布时间】:2016-05-09 06:36:08
【问题描述】:

下面是分配给变量$value

的数组
Array
(
    [colname] => leadnumber
    [tabname] => lead
    [uitypeid] => 14
    [fieldname] => leadnumber
    [filedlabel] => Lead Number
    [readmode] => Yes
    [mandmode] => No
    [fieldmode] => Yes
    [fieldseq] => 1
    -----
    ----
)

我需要什么。 我必须检查每个项目的值并附加如下。

$rule = "required|unique|read|tabname|lorem|ipsum|etc.."

我已经完成了如下操作。

if($value['mandmode'] == "No"){
    $rule = 'trim';
}
if($value['modfieldunique'] == "No"){
    $rule = $rule.'|unique';
}
if($value['readmode'] == "No"){
    $rule = $rule.'|read';
}

我的问题是,在将每个值附加到变量之前,我有很多这样的条件来检查每个值。如果我这样做,脚本运行时间会增加。有没有更好的方法来获得该格式的结果?

【问题讨论】:

  • 您能更具体地介绍一下这个概念吗?索引,附加值...

标签: php arrays concatenation


【解决方案1】:

你可以将规则构造成一个数组,像这样

$referenceRules = [
    "manmode"           => "trim",
    "modfieldunique"    => "unique",
    "readmode"          => "read"
];

然后遍历您的数组并检查哪些元素符合规则。
如果当前值为“否”,if 子句检查当前键是否也是 referenceRules 数组 and 的键。
假设您正在检查 所有 元素以匹配“否”。

$rules = [];

foreach($array as $key => $value){

    if (in_array($key,array_keys($referenceRules)) and $value == "No"){

        print $key . ":" . $value . PHP_EOL;    
        $rules[] = $referenceRules[$key];

    }

}

使用这个数组

$array = [
    "colname" => "leadnumber",
    "tabname" => "lead",
    "uitypeid" => 14,
    "fieldname" => "leadnumber",
    "filedlabel" => "Lead Number",
    "readmode" => "No",
    "manmode" => "No",  // I changed the key here to match your rules
    "fieldmode" => "Yes",
    "fieldseq" => 1
];   

上面会输出

readmode:No
manmode:No

最后只需implode$rules数组即可输出你需要的字符串

$ruleString = implode("|",$rules);
print $ruleString;

这将输出

read|trim

【讨论】:

    【解决方案2】:

    只需采用一组规则。

    并根据条件附加值。

    最后,我们将只获得所需的规则作为数组元素。

    现在,只需将它们全部附加|

    完成

    代码:

    <?php
    $rules = array();
    if ($value['mandmode'] == "No"){
     $rules[] = 'trim';
    }
    if ($value['modfieldunique'] == "No"){
     $rules[] = 'unique';
    }
    if ($value['readmode'] == "No"){
     $rules[] = 'read';
    }
    $rule = ! empty($rules) ? implode('|', $rules) : '';
    ?>
    

    【讨论】:

      【解决方案3】:

      试试下面的循环:

      $rule = '';
      foreach($value as $elementKey => $elementValue)
      {
          switch($elementKey)
          {
              case "mandmode":
                  if($elementValue == 'no')
                      $rule .= 'trim|';
              break;
      
              case "modfieldunique":
                  if($elementValue == 'no')
                      $rule .= 'unique|';
              break;
      
              case "readmode":
              case "XYZ":         //You can add more conditions as requirement
                  if($elementValue == 'no')
                      $rule .= 'read|';
              break;
          }
      }
      
      $rule = substr($rule,0,-1);
      

      您可以在可能出现相同条件的情况下添加多个案例...希望这会有所帮助

      【讨论】:

        【解决方案4】:
        // Take arrays from AlexAndrei answer
        $referenceRules = [
            "manmode"           => "trim",
            "modfieldunique"    => "unique",
            "readmode"          => "read"
        ];
        $array = [
            "colname" => "leadnumber",
            "tabname" => "lead",
            "uitypeid" => 14,
            "fieldname" => "leadnumber",
            "filedlabel" => "Lead Number",
            "readmode" => "No",
            "manmode" => "No",  // I changed the key here to match your rules
            "fieldmode" => "Yes",
            "fieldseq" => 1
        ];   
        // Save only those which equal No
        $temp = array_filter($array, function($i) { return $i === "No"; });
        // Take corresponding itemms from referenceRules array
        $temp = array_intersect_key($referenceRules, $temp);
        // Make string
        echo implode('|', $temp); // trim|read
        

        demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-31
          • 2023-03-19
          • 2013-10-29
          • 2013-02-05
          • 2020-10-02
          • 1970-01-01
          • 2017-03-19
          相关资源
          最近更新 更多