Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何简化这种代码?_Php - Fatal编程技术网

Php 如何简化这种代码?

Php 如何简化这种代码?,php,Php,此代码正常工作。然而,由于我还在学习PHP,我正在想办法缩短它。我使用这个片段为我要发送给某人的电子邮件生成标题 foreach($_POST as $key => $value) { if(strpos($key,'cloud') !== false && !$a) { $title .= "CS "; $a = true; } if(strpos($key,'dco') !== false &&

此代码正常工作。然而,由于我还在学习PHP,我正在想办法缩短它。我使用这个片段为我要发送给某人的电子邮件生成标题

foreach($_POST as $key => $value) {
    if(strpos($key,'cloud') !== false && !$a) {
        $title .= "CS ";
        $a = true;
    }

    if(strpos($key,'dco') !== false && !$b) {
        $title .= "DC ";
        $b = true;
    }

    if(strpos($key,'comm') !== false && !$c) {
        $title .= "BC ";
        $c = true;
    }

    if(strpos($key,'fiber') !== false && !$d) {
        $title .= "FC ";
        $d = true;
    }
}
我很确定他们做了同样的事情(所有的if语句)。如果你有什么建议/建议,请告诉我


干杯

您可以创建简单的函数。此代码应适用于:

foreach($_POST as $key => $value) {
    checkstrpos($key,'cloud',$a,$title,"CS ");
    checkstrpos($key,'dco',$b,$title,"DC ");
    checkstrpos($key,'comm',$c,$title,"BC ");
    checkstrpos($key,'fiber',$d,$title,"FC ");
}


function checkstrpos($key,$text, &$variable, &$title, $add) {
    if(strpos($key,$text) !== false && !$variable) {
        $title .= $add;
        $variable = true;
    }        
}

不使用引用的另一种解决方案:

foreach($_POST as $key => $value) {
    list($title, $a) = checkstrpos($key,'cloud',$a,$title,"CS ");
    list($title, $b) = checkstrpos($key,'dco',$b,$title,"DC ");
    list($title, $c) = checkstrpos($key,'comm',$c,$title,"BC ");
    list($title, $d) = checkstrpos($key,'fiber',$d,$title,"FC ");
}


function checkstrpos($key,$text, $variable, $title, $add) {
    if(strpos($key,$text) !== false && !$variable) {
        $title .= $add;
        $variable = true;
    }   
    return array($title, $variable);     
}

对我来说,我认为代码足够简单

如果您试图缩短代码,则可能会使其更难阅读

我的一条评论是不要使用像
$a
$b
$c
$d
这样的通用变量名。改用正确的描述性变量名

你可以交换这些条件的位置,也就是说,改变

if(strpos($key,'dco') !== false && !$b)


但这更多的是一种微观优化,而不是简化或改变可读性。

另一种不使用函数的解决方案:

    $infos = array(
        array('cloud', 'CS', &$a),
        array('dco', 'DC', &$b),
        array('comm', 'BC', &$c),
        array('fiber', 'FC', &$d)
    );

    foreach($_POST as $k => $v) {
        foreach($infos as $info) {
            if ( !$info[2] && strpos($k, $info[0]) !== false) {
                $title .= $info[1]. ' ';
                $info[2] = true;
            }
        }
    }

但这不是最好的办法。正如另一个答案所建议的,最好使用一个函数:一个匿名函数(又称闭包)。

这些变量
$a
$b
$c
$d
来自哪里?@AmalMurali我想这意味着
如果
它们还没有设置好。没错!恭喜Daan:)@Daan:我在问它们是如何初始化的。不,这并不意味着。它只是检查这些变量是否为false。我正在检查它们是否存在。我可以把这个布尔值改成任何其他值。foreach块不能缩短到只有一行吗?但是为什么呢?当然,你可以创建另一个函数,然后在foreach中,你将只有一个函数,你当然可以将所有函数从foreach移到函数,但我认为这段代码是最好的选择。你可以在foreach中看到一些正在发生的事情,如果你愿意,你可以随时添加其他选项。现在你有了云、dco等等,但有些你可能还想添加一些东西,这样看起来更直观,我觉得听起来很有说服力。谢谢你!另一个问题,一个符号在上面做什么?它导致函数不会复制变量,而会处理原始变量,这样它就可以更改它的值。我是唯一一个使用代码段的人,所以没问题。很抱歉,我现在还不能投赞成票。我会听从你的劝告。非常感谢。“我是唯一一个使用代码片段的人,所以没关系”——事实上,当我说最好使用描述性变量名时,这至少对你自己和其他人都有好处。因此,当你在12个月后回到代码时,你会记住所有这些变量的含义。
    $infos = array(
        array('cloud', 'CS', &$a),
        array('dco', 'DC', &$b),
        array('comm', 'BC', &$c),
        array('fiber', 'FC', &$d)
    );

    foreach($_POST as $k => $v) {
        foreach($infos as $info) {
            if ( !$info[2] && strpos($k, $info[0]) !== false) {
                $title .= $info[1]. ' ';
                $info[2] = true;
            }
        }
    }