• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Armadillo

optimizar função recursiva

2 mensagens neste tópico

Já me mandou o serviço do apache abaixo umas nao-sei-quantas vezes e é lento que nem um caracol!

Sugestoes para melhorar o meu script serao muito bem aceites!

O que o meu codigo faz é devolver num vector unidimensional (requisito imprescindivel) todas as pastas existentes, dado um caminho inicial.

function pesquisa_dir_recursivamente($directorio, $filtro=FALSE)
{

if(substr($directorio,-1) == '/')                                                //se o caminho tiver no fim uma barra
    {
        $directorio = substr($directorio,0,-1);                                    // removemos.
    }

    
if(!file_exists($directorio) || !is_dir($directorio))                            //se caminho for invalido  ou nao for um directorio...
    {
    return FALSE;                                                                // ... retorna FALSE e sai da funcao
}elseif(is_readable($directorio))                                                // ... se o caminho eh valido
    {
     $directorio_list = opendir($directorio);                                    // abrimos o directorio
     while (FALSE !== ($ficheiro = readdir($directorio_list)))                    // e procuramos items nele
     {
        if($ficheiro != '.' && $ficheiro != '..')                                //se apontador de ficheiro nao for o actual directorio ou o directorio pai
        {
            $path = $directorio.'/'.$ficheiro;                                    //construimos o novo caminho a pesquisar
            if(is_readable($path))                                                // se o caminho for valido
        {
                $subdirs = explode('/',$path);                                     // dividimos o novo caminho em directorios
                if(is_dir($path))                                                // se o novo caminho for um directorio
                     {
                     $directorio_tree[] = array($path,
                    pesquisa_dir_recursivamente($path, $filtro));                // pesquisamos o novo caminho chamando esta funcao (recursividade)
                    
                }
            }
           }
     }

    closedir($directorio_list);                                                 // fechar directorio
    return $directorio_tree;                                                    // retornar a lista de ficheiros
    }
else
    {                                                                            // se o caminho nao for valido
     return FALSE;                                                                // ... retorna FALSE
    }
}
    

//testando funcoes

function listaArray(&$item2, $key)
{

    global $pastas;
    //echo "$item2<br>\n";
    
    if (!is_array($item2) && !is_null($item2))        //se nao for um vector
        {
        $pastas[]=$item2;                            //adiciona item ao vector
        }
    array_walk($item2, 'listaArray');
}


$array = pesquisa_dir_recursivamente('..\..');     //ler disco em busca de dirs
array_walk($array, 'listaArray');                //retornar apenas as dirs

$pastas=array_unique($pastas);                    //remover possiveis duplicacoes nas pastas
sort($pastas);
echo '<pre>';
var_dump ($pastas);
echo '</pre>';

Também nao consigo fazer uma pesquisa por um caminho do tipo "c:\programas", apenas "..\..\". O que posso fazer para mudar isto?

Acho que o codigo esta bem comentado. Se tiverem duvidas em relação ao meu codigo digam alguma coisa.

Ja agora, estou a usar a versao 4.4.3 do PHP.

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também nao consigo fazer uma pesquisa por um caminho do tipo "c:\programas", apenas "..\..\". O que posso fazer para mudar isto?

Tens de escapar as \. Ou seja, "C:\\Programas" e "..\\..\\" ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora