有人可以就如何使这段代码大大缩短给我一些建议吗?
它的作用是从上传到服务器的文本文件中获取数据。它读取文件并查找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";
}
任何帮助都会对你们有所帮助!
答案 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将每个过程移动到适当的哑数据类。
- 继续,直到您删除了原始课程的所有行为。如果原始类是纯粹的程序类,则删除它是非常令人满意的。