Php 如何简化这种代码?
此代码正常工作。然而,由于我还在学习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 &&
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;
}
}
}