while(strcasecmp(trim($l),"end")!=0 && $pos<count($getjkl))
{
$pieces = preg_split("/[\s]+/",trim($l));
if(substr($pieces[0],0,1)!="#" && count($pieces)>1)
{
if(file_exists($getprj."/mat/".str_replace("\\", "/",$pieces[1])))
{
$found = false;
for($j=0; $j<count($compilefiles); $j++)
{
if(strcasecmp($compilefiles[$j][2],"mat\\".$pieces[1])==0)
$found=true;
}
if($found==false)
{
$compilefiles[$numfiles][0] = $fileoffset;
$compilefiles[$numfiles][1] = filesize($getprj."/mat/".str_replace("\\", "/",$pieces[1]));
$compilefiles[$numfiles][2] = "mat\\".$pieces[1];
$fileoffset = $fileoffset + $compilefiles[$numfiles][1];
$numfiles++;
}
}
else if(file_exists($getprj."/3do/mat/".str_replace("\\", "/",$pieces[1])))
{
$found = false;
for($j=0; $j<count($compilefiles); $j++)
{
if(strcasecmp($compilefiles[$j][2],"3do\\mat\\".$pieces[1])==0)
$found=true;
}
if($found==false)
{
$compilefiles[$numfiles][0] = $fileoffset;
$compilefiles[$numfiles][1] = filesize($getprj."/3do/mat/".str_replace("\\", "/",$pieces[1]));
$compilefiles[$numfiles][2] = "3do\\mat\\".$pieces[1];
$fileoffset = $fileoffset + $compilefiles[$numfiles][1];
$numfiles++;
}
}
}
$l=$getjkl[$pos];
$pos++;
}
这是一段代码,我在其中读取文件并检查其中是否存在列出的文件。好吧,我实际上读过这样的文件:
$getjkl = preg_split("/\R/",file_get_contents($levelfile));
然后逐行逐步完成。对于不同的文件类型,此块重复10次,略有不同。然后我意识到我将不得不多次浏览一些文件类型,因为稍后会出现更多的文件名。但是我没有重复这段代码,而是想我可以多次调用这个代码块。所以我做了这样的事情:
while(strcasecmp(trim($l),"end")!=0 && $pos<count($getjkl))
{
$pieces = preg_split("/[\s]+/",trim($l));
if(substr($pieces[0],0,1)!="#" && count($pieces)>1)
{
GetMats($getprj,$pieces,$compilefiles,$numfiles,$fileoffset);
}
$l=$getjkl[$pos];
$pos++;
}
function GetMats(&$getprj,&$pieces,&$compilefiles,&$numfiles,&$fileoffset)
{
if(file_exists($getprj."/mat/".str_replace("\\", "/",$pieces[1])))
{
$found = false;
for($j=0; $j<count($compilefiles); $j++)
{
if(strcasecmp($compilefiles[$j][2],"mat\\".$pieces[1])==0)
$found=true;
}
if($found==false)
{
$compilefiles[$numfiles][0] = $fileoffset;
$compilefiles[$numfiles][1] = filesize($getprj."/mat/".str_replace("\\", "/",$pieces[1]));
$compilefiles[$numfiles][2] = "mat\\".$pieces[1];
$fileoffset = $fileoffset + $compilefiles[$numfiles][1];
$numfiles++;
}
}
else if(file_exists($getprj."/3do/mat/".str_replace("\\", "/",$pieces[1])))
{
$found = false;
for($j=0; $j<count($compilefiles); $j++)
{
if(strcasecmp($compilefiles[$j][2],"3do\\mat\\".$pieces[1])==0)
$found=true;
}
if($found==false)
{
$compilefiles[$numfiles][0] = $fileoffset;
$compilefiles[$numfiles][1] = filesize($getprj."/3do/mat/".str_replace("\\", "/",$pieces[1]));
$compilefiles[$numfiles][2] = "3do\\mat\\".$pieces[1];
$fileoffset = $fileoffset + $compilefiles[$numfiles][1];
$numfiles++;
}
}
}
我花了一些时间才发现变量不会自动跟随并在函数中被更改,除非我&
引用它们。但是,在对两个代码块执行此操作后,它似乎进一步减速,以便达到30秒的执行限制。功能真的那么贵吗?在保留数组和计数器的同时回调重复代码的最佳方法是什么?
$getprj = string = folder
$pieces = array
$compilefiles = array (set a ways back)
$numfiles = int ( = 0 from the start) (counter)
$fileoffset = int ( = 0 from the start) (counter)