脚本中的elseif语句太多了

时间:2014-08-09 16:52:44

标签: php

我刚刚编写了一个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;
    }

4 个答案:

答案 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)

使用DRY原则,@ Karl的回答更有效率,但如果你只是在其他情况下寻找替代方案,你发现自己被埋在了elseif中,也许你会发现switch()更清洁,更容易理解。

我同意在彼此嵌套的其他地方会让人感到困惑。在交换机中,您的最后一个“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


}