Повторять код, сделать функцию, но оставить переменные глобальными? - PullRequest
0 голосов
/ 28 мая 2018
    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)
...