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)