Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renato Siroma

Listar e Agrupar Diretórios

Recommended Posts

Olá amigos, as linhas de código em PHP abaixo faz uma lista dos diretórios...

 

O desafio é; Juntar todos os diretórios relativos a uma respectiva letra...

E; Ao invéz de fazer a lista com todos os diretórios, Listar apenas as iniciais dos diretórios existentes.

Quando clicado no link dos diretórios existentes, ele mostra todos diretórios que começam com aquela letra.

 

$dir	= getcwd();
$files1 = scandir($dir);
$result = count($files1);
$files2 = array_shift($files1);
$files2 = array_shift($files1);
for($x=0;$x<$result;$x++)
echo "<a href=\"$files1[$x]\">$files1[$x]</a><br>\n\r";

Exemplo

 

Diretórios sem tratamento:

 

Actions

Atividades

Dicionario de dados

Eventos

Historia

Zoom

Zoológico

 

 

Após o tratamento:

 

A

D

E

H

Z

 

Clicando em 'A' apareçe:

.. // -> Pasta anterior '..' referente ao comando cd ..

Actions

Atividades

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tal?

<?php
$dir = getcwd() . '/*'; // Diretório atual
$lsta = array(); // Lista de diretórios
while($item = glob($dir, GLOB_ONLYDIR)) // Busca por diretórios
	  if($item != '.' && $item != '..') // Verifica o nome
			$lista[] = strtoupper(substr($item)); // Adiciona apenas a primeira letra na lista
array_unique($lista); // Elimina ocorrencias dulpicadas
foreach($lista as $item) // Percorre a lista
	  echo '<a href="?letra="' . $item . '>' . $item . '</a>'; // Imprime unitariamente os valores da lista
?>
Num testei naum, mas pra primeira parte deve ser o suficiente

Pra segunda parte

<?php
$dir = getcwd() . '/' . $_GET['letra'] . '*'; // Diretório atual
$lsta = array(); // Lista de diretórios
while($item = glob($dir, GLOB_ONLYDIR)) // Busca por diretórios
	  $lista[] = $item; // Adiciona apenas a primeira letra na lista
foreach($lista as $item) // Percorre a lista
	  echo $item; // Imprime unitariamente os valores da lista
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigos, as linhas de código em PHP abaixo faz uma lista dos diretórios...

 

O desafio é; Juntar todos os diretórios relativos a uma respectiva letra...

E; Ao invéz de fazer a lista com todos os diretórios, Listar apenas as iniciais dos diretórios existentes.

Quando clicado no link dos diretórios existentes, ele mostra todos diretórios que começam com aquela letra.

 

$dir	= getcwd();
$files1 = scandir($dir);
$result = count($files1);
$files2 = array_shift($files1);
$files2 = array_shift($files1);
for($x=0;$x<$result;$x++)
echo "<a href=\"$files1[$x]\">$files1[$x]</a><br>\n\r";

Exemplo

 

Diretórios sem tratamento:

 

Actions

Atividades

Dicionario de dados

Eventos

Historia

Zoom

Zoológico

 

 

Após o tratamento:

 

A

D

E

H

Z

 

Clicando em 'A' apareçe:

.. // -> Pasta anterior '..' referente ao comando cd ..

Actions

Atividades

 

Hei !!!

 

Kara, acabei d escrever isso aqui mas acho que deve resolver p você...

 

primeiro a listagem de diretórios:

 

Actions

Atividades

Dicionario de dados

Eventos

Historia

Zoom

Zoológico

 

agora usando a classe:

 

$lista = new FilesystemExplorer( "." );

print_r( $lista->A );

deve produzir:

 

array(2)
(
	[0] => Actions
	[1] => Atividades
)

print_r( $lista->At );

deve produzir:

 

string(10) "Atividades"

Agora supondo que dentro de Actions exista o seguinte:

 

Actions/item1.php

Actions/index.php

Actions/OutroDiretorio

Actions/OutroDiretorio/item2.php

 

$lista = new FilesystemExplorer( "." );

print_r( $lista->Actions->i );

deve produzir:

 

array(2)
{
   [0] => item1.php
   [1] => index.php
}

print_r( $lista->Actions->OutroDiretorio->item );

deve produzir:

 

string(9) "item2.php"

Resumindo, com essa classe você pode navegar pelos diretórios, e listar o conteúdo dele...

O agrupamento é feito por 1 (uma) ou mais letras:

i -> index.php, interessante.php, investigar.php, isso.php

in -> index.php, interessante.php, investigar.php

ind-> index.php

 

se o padrão bater com o nome COMPLETO de um diretório então ele retorna uma instancia da classe FilesystemExplorer para o diretório.

 

<?
	class FilesystemExplorer {
		const 
			DEFAULT_LOCATION		= ".",
			TYPE_DIR				= 0,
			TYPE_FILE				= 1,
			TYPE_LINK				= 2,
			MSG_ERR0				= "A localizacão precisa ser um diretório.",
			MSG_ERR1				= "Não foi possível abrir a localizacão: %s";
			
		protected
			$handle,
			$list,
			$links,
			$filenames,
			$directories;
			
		public
			$current,
			$filter;
			
		public function __construct( $location = null ){
			if ( $location ){
				if ( !is_dir( $location ) ){
					throw new Exception( self::MSG_ERR0 );
				}
			} else $location = self::DEFAULT_LOCATION;
			
			$this->list			= array();
			$this->filenames	= array();
			$this->directories	= array();
			
			$this
				->openLocation( $location )
				->scan();
		}
		
		protected function openLocation( $location ){
			if ( ( $temp_handle = opendir( $location ) ) ){
				$this->current	= $location;
				$this->handle	= $temp_handle;
			} else {
				throw new Exception( sprintf( self::MSG_ERR1 , $location ) );
			}
			
			return( $this );
		}
		
		protected function scan(){
			$this->list			= array();
			$this->links		= array();
			$this->filenames	= array();
			$this->directories	= array();
			
			while ( ( ( $item = readdir( $this->handle ) ) !== false ) ){
				$pos = false;
				
				if ( $item != "." ){
					if ( is_dir( $item ) ){
						$this->directories[] = $item;
						$type	= self::TYPE_DIR;
						$pos	= count( $this->directories ) - 1;
					} elseif ( is_link( $item ) ){
						$this->links[] = $item;
						$type	= self::TYPE_LINK;
						$pos	= count( $this->links ) - 1;				
					} else {
						$this->filenames = $item;
						$type	= self::TYPE_FILE;
						$pos	= count( $this->filenames ) - 1;
					}
				}
				
				if ( $pos !== false )
					$this->list[] = array( $type , $pos , $item );
			}
			
			//print_r( $this->list );
			
			return( $this );
		}
		
		public function __get( $pattern ){
			$ret	= null;
			$length	= strlen( $pattern );
			
			for ( $i = 0 , $t = count( $this->list ); $i < $t; $i++ ){
				$item			= $this->list[ $i ][ 2 ];
				$item_length	= strlen( $item );
				
				if ( $item_length >= $length ){
					if ( ( $item_length == $length ) && ( $item == $pattern ) ){
						$location_str = sprintf( "%s/%s" , $this->current , $item );
						
						if ( is_dir( $location_str ) ){
							$ret = new FilesystemExplorer( $location_str );
							break;
						}
					}
					
					if ( substr( $item , 0 , $length ) == $pattern ){
						if ( $ret == null ) $ret = $item;
						elseif ( is_array( $ret ) )
							$ret[] = $item;
						else {
							$aux = $ret;
							$ret = array( $aux , $item );
						}
					}
				}
			}
			
			return( $ret );
		}
	}
?>

 

Bom, é isso...

 

 

[]'s João Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz correndo, mas pro desafio ta valendo :lol:

 

$dir	   = scandir(".");	
$result	= array();
$array_dir = array();

if($_SERVER["QUERY_STRING"]){
$letra = isset($_GET["letra"]) ? trim($_GET["letra"]) : "";
if($letra != ""){
	foreach($dir as $k){
		if(is_dir($k) && $k != "." && $k != ".."){
			if($letra == $k{0}){
				$array_dir[] = $k;
			}	
		}
	}		
	foreach($array_dir as $d){
		echo strtoupper($d) ."<br />";
	}			
} 
} else {
foreach($dir as $k){
	if(is_dir($k) && $k != "." && $k != ".."){
		$array_dir[] = $k{0};
	}
}
$result = array_unique($array_dir);	
foreach($result as $d){
	echo "<a href=\"dir.php?letra=". $d ."\">". strtoupper($d) ."</a><br />";
}		
}

 

OBS: mas com certeza se eu tivesse que fazer esse codigo para um projeto ele ficaria bem melhor e com menos loops.

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
$letras = "";
@$letra = $_GET["letra"];
$dir = getcwd();
$files = scandir($dir);
for ($i = 0; $i < count($files); $i++) {
	$f = $files[$i];
	if (is_dir($f)) {
		if ($f == "." || $f == "..") {}
		else {
			$first = substr($f, 0, 1);
			if (!$_GET) {
				if (strpos($letras, $first) === false) {
					$letras .= $first;
				}
				else {}
			}
			else {
				if ($first == $letra) {
					echo $f."<br>";
				} else {}
			}
		}
	}
}

if (!$_GET) {
	for ($a = 0; $a < strlen($letras); $a++) {
		echo "<a href='?letra=$letras[$a]'>$letras[$a]</a><br>";
	}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.