简化 PHP 中的长 IF 语句

Simplify a long IF statement in PHP

下面的if语句有没有更简单的格式?

if((!empty($_SESSION['email'])) && (!empty($_SESSION['serial'])) && (!empty($_SESSION['name'])) && (!empty($_SESSION['number'])) && (!empty($_SESSION['institution'])) && (!empty($_SESSION['address'])) && (!empty($_SESSION['item2']))){ 
    echo "OK u can proceed";
} else {
    echo "U didn't complete the requested info";
}

抱歉,如果这对您来说太简单了,但非常感谢任何专业建议。

就"mind games"

$arr = array_flip('email', 'serial', 'name','number'...);
if (count(array_filter(array_intersect_key($_SESSION, $arr))) == count($arr)) {

您可以构建一个函数,在其中传递所有要检查的键。 我已将 $_SESSION 更改为 $SESSION 以使用某些值来欺骗数组 ...

<?php

$SESSION = [
    'email' => 'xx',
    'serial' => 'xx',
    'name' => 'xx',
    'number' => 'xx',
    'institution' => 'xx',
    'address' => 'xx',
    'item2' => 'xx'
];

$keys = [
    'email',
    'serial',
    'name',
    'number',
    'institution',
    'address',
    'item2'
];

if(isNotEmpty($SESSION, $keys)) {
    echo "OK u can proceed";
} else {
    echo "U didn't complete the requested info";
}

function isNotEmpty($array, $keys) {
    foreach($keys as $key) {
        if(empty($array[$key])) {
            return false;
        }
    }

    return true;
}

PHP Fiddle

这只是我的看法,但我觉得你的表达很好。也许你可以用另一种方式格式化它以使其更具可读性:

if ( !empty($_SESSION['email']) && 
     !empty($_SESSION['serial']) && 
     !empty($_SESSION['name']) && 
     !empty($_SESSION['number']) && 
     !empty($_SESSION['institution']) && 
     !empty($_SESSION['address']) &&
     !empty($_SESSION['item2']) ) {

     /* Proceed */

} else {

     /* Don't proceed */

}

或者使用自定义验证函数:

/* My original version */
function filled_required_fields($fields, $array) {
    $valid = true;
    foreach ($fields as $field) {
        $valid = $valid && !empty($array[$field]);
        if (!$valid) return false;
    }
    return $valid;
}

/* Cleaner solution based on @caramba's answer */
function filled_required_fields($fields, $array) {
    foreach ($fields as $field) {
        if (empty($array[$field])) return false;
    }
    return true;
}


if (filled_required_fields(['email', 'serial', 'name', 'number', 'institution', 'address', 'item2'], $_SESSION) {

    /* Proceed */

} else {

    /* Don't proceed */
}

因为条件语句会 "short circuit" 在第一次失败时,使用迭代器重写你的进程会降低性能。

如果您只想向用户提供一般性反馈,请使用您当前的方法,不要使用多余的括号。

if(!empty($_SESSION['email']) &&
   !empty($_SESSION['serial']) &&
   !empty($_SESSION['name']) &&
   !empty($_SESSION['number']) &&
   !empty($_SESSION['institution']) &&
   !empty($_SESSION['address']) &&
   !empty($_SESSION['item2'])){
    // valid
}

或者(相同):

if(empty($_SESSION['email']) ||
   empty($_SESSION['serial']) ||
   empty($_SESSION['name']) ||
   empty($_SESSION['number']) |
   empty($_SESSION['institution']) ||
   empty($_SESSION['address']) ||
   empty($_SESSION['item2'])){
    // invalid
}

只有当你想指定失效的原因时,你才需要设置一个迭代过程。此外,如果您要执行迭代来验证,您可以借此机会从 $_SESSION 数组中删除任何不需要的元素,这些元素可能是作恶者注入的,以利用超全局上的任何未来循环。

$valid_keys=['email','serial','name','number','institution','address','item2'];
$validated=true; // default value
foreach($valid_keys as $key){
    if(!empty($_SESSION[$key])){
        $session_data[$key]=$_SESSION[$key];
    }else{
        echo "Oops, there was missing data on $key";
        $validated=false;
        break;
    }
}
if($validated){...
// from this point, you can confidently run loops on `$session_data` or slap it directly into a pdo call knowing that it has been validated and ordered.

综上所述,如果您的 $_SESSION 元素有可能包含 zero-ish/false-y/empty 值,那么 isset() 是更好的选择(只有 NULL会被抓住)。 isset() 的另一个好处是它允许将多个变量写入单个调用并保持 same/intended 性能。

if(isset($_SESSION['email'],$_SESSION['serial'],$_SESSION['name'],$_SESSION['number'],$_SESSION['institution'],$_SESSION['address'],$_SESSION['item2'])){
    // valid
}

if(!isset($_SESSION['email'],$_SESSION['serial'],$_SESSION['name'],$_SESSION['number'],$_SESSION['institution'],$_SESSION['address'],$_SESSION['item2'])){
    // invalid
}