如何让我的PHP代码更短?

时间:2011-02-14 18:55:56

标签: php

有人可以就如何使这段代码大大缩短给我一些建议吗?

它的作用是从上传到服务器的文本文件中获取数据。它读取文件并查找3个关键字。我将每个关键字放在一个数组中,然后输出找到该关键字的整行。然后在foreach statemens中循环并回显该行(为了调试目的,但是当完成时我不希望它回显该行,但只是做计数)然后它计算关键字的所有实例。最后,我回应了出现次数。我觉得这可以更高效,更有条理地完成。

$sf->countLines()指的是我处理小型操作的类,在这种情况下,我能够计算用户上传的文件中的行数。我最终会编译我的脚本并从中创建一个类。但是现在我正在学习和修补,看看如何顺利完成。

$_ = NULL;
$msg = "<br />[ Your Script ".$handle->file_dst_name_body." has been uploaded ]<br />";
$file = $handle->file_dst_path.$handle->file_dst_name_body.'.'.$handle->file_dst_name_ext;
$open = fopen($file, 'r+');
$story = utf8_decode(fread($open, filesize($file)));

echo $msg.'<br />';

$sf = new TextFileReader($file);
$sf->seekLine(1); // Go to line 1

echo "Total number of lines: ".$sf->countLines()."<br />";
if(preg_match_all('/\s{68}(.*)/m', $story, $_))
{
    $unique_pages = array_unique(array_map(create_function('$a', 'return ucfirst(strtolower(trim($a)));'), $_[1]));
    echo "<span><strong>Pages: </strong>".count($unique_pages)."</span><br />";
}
$searchfor = array();
$searchfor[0] = 'INT.';
$searchfor[1] = 'EXT.';
$searchfor[2] = 'I/E.';

// get the file contents, assuming the file to be readable (and exist)
$contents = mb_convert_encoding(file_get_contents($file), "UTF-8", "auto");
// escape special characters in the query
$pattern = preg_quote($searchfor[0], '/');
// finalize the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";

$list = "";
$numInt  = 0;
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches))
{
    $list = "<ol>";
    foreach($matches as $match) {
        $list .= "<li><div class='int'>".implode("</div></li><li><div class='int'>", $match)."</div></li>\n";
    }
    $numInt = count($matches[0]);
    $list .= "</ol>";
}else{
    $list = "No matches found";
}

// escape special characters in the query
$pattern2 = preg_quote($searchfor[1], '/');
// finalize the regular expression, matching the whole line
$pattern2 = "/^.*$pattern2.*\$/m";
$list2 = "";
$numExt  = 0;
// search, and store all matching occurences in $matches
if(preg_match_all($pattern2, $contents, $matches2))
{
    $list2 = "<ol>";
    foreach($matches2 as $match) {
        $list2 .= "<li><div class='int'>".implode("</div></li><li><div class='int'>", $match)."</div></li>";
    }
    $numExt = count($matches2[0]);
    $list2 .= "</ol>";
}else{
    $list2 = "No matches found";
}

// escape special characters in the query
$pattern3 = preg_quote($searchfor[2], '/');
// finalize the regular expression, matching the whole line
$pattern3 = "/^.*$pattern3.*\$/m";
$list3 = 0;
$numIe = 0;
// search, and store all matching occurences in $matches
if(preg_match_all($pattern3, $contents, $matches3))
{
    $list3 = "<ol>";
    foreach($matches3 as $match) {
        $list3 .= "<li><div class='int'>".implode("</div></li><li><div class='int'>", $match)."</div></li>\n";
    }
    $numIe = count($matches3[0]);
    $lis3t .= "</ol>";
}else{
    $list3 = "No matches found";
}

任何帮助都会对你们有所帮助!

2 个答案:

答案 0 :(得分:2)

对于初学者来说,这段代码的编写方式几乎完全相同:

// search, and store all matching occurences in $matches
if (preg_match_all($pattern2, $contents, $matches2)) {
    $list2 = "<ol>";
    foreach($matches2 as $match) {
        $list2 .= "<li><div class='int'>".implode("</div></li><li><div class='int'>", $match)."</div></li>";
    }
    $numExt = count($matches2[0]);
    $list2 .= "</ol>";
}
else {
    $list2 = "No matches found";
}

您可以将其拉入自己的方法中,这样您就不会重复代码(并将其分别保存在所有这些地方。)

答案 1 :(得分:1)

描述代码在简单句子中的作用。然后为每个句子创建一个函数并将逻辑提取到其中。如果您发现重复句子,请重复使用代码中的函数。

您还可以考虑将代码中的代理实体转换为对象,例如使用OOP。那将是Convert procedural design to objects重构:

  

力学

     
      
  • 获取每种记录类型并将其转换为带有访问器的哑数据对象。
  •   
  • 如果您有关系数据库,请取出每个表并将其转换为哑数据对象。
  •   
  • 获取所有程序代码并将其放入单个类中。
  •   
  • 采取每个长程序并应用提取方法和相关的重构来分解它。在分解过程时,使用Move Method将每个过程移动到适当的哑数据类。
  •   
  • 继续,直到您删除了原始课程的所有行为。如果原始类是纯粹的程序类,则删除它是非常令人满意的。
  •