我刚刚编写了一个php脚本,我必须使用很多elseif语句(即大约300个左右);这使得脚本非常冗长,并降低了代码的可读性,这使得代码调试非常艰巨。我的查询是在这种情况下如何处理长的elseifs?除了使用elseif之外,你还建议其他什么吗?我很乐意听到。
我在下面的PHP脚本的一小部分中找到了我检查每一行的具体单词并处理它们。
while (! feof($readfile)) {
//Read in the file line by line
$line = fgets($readfile, 4096);
if (preg_match("/gold/", $line)) {
//Call the user-defined function
$line = myfunction($line, "gld");
if(is_writable($file2)) { //Confirm that the file is writable.
file_put_contents($file2, $line . PHP_EOL, FILE_APPEND);
// Write the data
}
} elseif (preg_match("/men/", $line)) {
//Call the user-defined function
$line = myfunction($line, "mdo");
if(is_writable($file2)) { //Confirm that the file is writable.
file_put_contents($file2, $line . PHP_EOL, FILE_APPEND);
// Write the data
}
} elseif (preg_match("/sac/", $line)) {
//Call the user-defined function
$line = myfunction($line, "sac");
if(is_writable($file2)) { //Confirm that the file is writable.
file_put_contents($file2, $line . PHP_EOL, FILE_APPEND);
// Write the data
}
} else {
echo "No match: " . $line;
}
答案 0 :(得分:5)
使用foreach,数组存储每个模式会使代码更短,更易读。代码未经过测试,但如果出现任何问题,您应该了解如何修复它。
$patterns = array(
array('/gold/', 'gld'),
array('/men/', 'mdo'),
array('/sac/', 'sac')
);
while (!feof($readfile)) {
$match = false;
foreach($patterns as $pattern) {
if(preg_match($pattern[0])) {
$line = myfunction($line, $pattern[1]);
if(is_writable($file2)) {
file_put_contents($file2, $line . PHP_EOL, FILE_APPEND);
}
$match = true;
break;
}
}
if($match === false) {
echo "No match: " . $line;
}
}
答案 1 :(得分:0)
除了高效编码,您还可以拥有可读的编码风格。我的意思是你写的代码干净,例如你总是使用{}和你的ifs,或者你总是使用:if ifs并使用好的缩进。
使用IDE,您可以为自己定义样式并重新格式化代码。当然你需要一个整洁的风格。
我建议您搜索有效的PHP。
祝你好运
答案 2 :(得分:0)
这基本上是@Karl已发布的变体。假设要匹配的模式是简单的字符串,使用preg_match
是过度的:
$rules = array(
'gold' => 'gld',
'men' => 'mdo',
'sac' => 'sac',
);
while (!feof($readfile)) {
$chunk = fgets($readfile, 4096);
$result = null;
foreach ($rules as $k => $v) {
if (strpos($chunk, $k) !== false) {
$result = myfunction($chunk, $v);
break;
}
}
if (! is_null($result))
echo 'No match: ' . $chunk;
elseif (is_writable($file2))
file_put_contents($file2, $result . PHP_EOL, FILE_APPEND);
}
答案 3 :(得分:0)
我同意在彼此嵌套的其他地方会让人感到困惑。在交换机中,您的最后一个“else”结果将是“default:”case switch。
switch($line){
case(preg_match("/gold/", $line)):
//Call the user-defined function
$line = myfunction($line, "gld");
if(is_writable($file2)) { //Confirm that the file is writable.
file_put_contents($file2, $line . PHP_EOL, FILE_APPEND);
// Write the data
break;
case(preg_match("/men/", $line)) :
//.... rest of cases and logic below
}