重复代码,创建函数,但保持变量全局?

时间:2018-05-28 00:26:09

标签: php function variables

    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)

0 个答案:

没有答案