检查条件,并多次附加字符串


check if condition and append string multiple times

下面是分配给变量$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';
}

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

您可以将规则构造成一个数组,如以下

$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

只需获取一组规则。

并根据条件向其附加值。

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

现在,只需用|将它们全部追加即可。

完成

代码:

<?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) : '';
?>

尝试以下循环:

$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);

您可以添加多个可能出现相同条件的情况。。。希望这能帮助

// 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

演示