Ir para conteúdo

POWERED BY:

Arquivado

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

Ronny Santana

Elementos Array -> Codigo de Nomes

Recommended Posts

Ola Amigos, tava só testando e acabou saindo algo legal.

Lembrando que é apenas um teste com array, pode ser feito facilmente com DB.

 

<?php	
$Letra = $_GET[l];

$array = array(
	"Ronny","Maicon","Allan","Norberto","Elisa","Beto","Cristielle","Camila", "Aghata", "Cristiane","Valeria","Sandra","Wanessa","Vanessa","Adilson","Liliane",
	"Lucitania","Maria","Sebastian","Felipe","Bruno","Natali","Laurenice","Antonio","Ana","Nicole","Stephany","Bianca","Brenda","Clarinha","Cecilia","Dalila",
	"Gisele","Guilherme","Glaucio","Fernanda","Adriana","Magali","Nivia","Noemia","Olivia","Paola","Patricia","Valeska","Walter","Yasmin","Xaquira","Sabrina",
	"Patrick","Mariana","Haroldo","Heloisa","Edwirge","Eloisa","Acácia","Célia","Cristina","Chaylla","Angelica","Andressa","Amanda","Emilio","Giovana","Jacqueline",
	"Katherina","Malka","Marta","Samira","Veralice","Wellington","Zenóbio","Zelinda","Iracema","Ivan","Isis","Isadora","Inacio","Ícaro","Henri","Quitéria","Quirino",
	"Quenia","Quincas","Talia","Thauany","Teodoro","Talita","Theseo","Thayná","Tania","Tricia","Umberto","Priscila","Ursulina","Ubaldo","Ursula","Ubirajara"
	);

$alfabeto = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");

$total = count($array); 
shuffle($array);

print "[ <a href='array_foreach_letra.php' >[ VER TODOS ]</a> ]  "; foreach ($alfabeto as $link) { 	print "[ <a href='?l={$link[0]}' >{$link[0]}</a> ]  "; }
print "<br/>";
print "{$total} Nomes Cadastrados! <br/>";
print "<br/><br/>";

if (isset($Letra)) {
foreach ($array as $nome) {
	if($nome[0] ==  $Letra) {
		print "{$nome} <br/>";
	}
}
}

else {
foreach ($array as $nome) {
		print "{$nome} <br/>";
}
}

 

Por favor, gostaria que os mais experientes em programação dessem alguma opnião construtiva.

 

 

O RESULTADO PODE SER VISTO NESSE LINK

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para esse tipo de tarefa, pode-se utilizar uma função nativa do PHP chamada sort.

 

Porém, a nível de aprendizado, é interessante se criar um algoritmo para isso.

 

Tente fazer! :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php	
$Letra = $_GET[l];

if (isset($Letra)) {

 

Ronny,

 

Sempre que você for fazer um experimento, utilize no início do seu código o seguinte:

 

<?php
ini_set( 'display_errors' , 'On' );
error_reporting( E_ALL | E_STRICT );

 

Se você executar seu código com as instruções acima, você receberá:

 

PHP Notice: Use of undefined constant l - assumed 'l' in /home/neto/teste.php on line 2
PHP Stack trace:
PHP 1. {main}() /home/neto/teste.php:0

Notice: Use of undefined constant l - assumed 'l' in /home/neto/teste.php on line 2

Call Stack:
0.0002 	632176 1. {main}() /home/neto/teste.php:0

PHP Notice: Undefined index: l in /home/neto/teste.php on line 2
PHP Stack trace:
PHP 1. {main}() /home/neto/teste.php:0

Notice: Undefined index: l in /home/neto/teste.php on line 2

Call Stack:
0.0002 	632176 1. {main}() /home/neto/teste.php:0

 

O primeiro NOTICE é referente ao uso do l sem as aspas.

 

Quando você não faz isso, o PHP vai procurar uma constante com esse nome e, como não encontrará, exibirá um aviso dizendo que não a encontrou e está tratando essa constante como uma string literal de mesmo nome.

 

O segundo NOTICE é referente ao uso do índice l (agora já é a string literal) na super global $_GET.

 

Se você não passar o campo l via GET, você receberá esse aviso dizendo que $_GET não possui esse campo.

 

Para corrigir os dois problemas, você pode modificar seu código para:

 

<?php
ini_set( 'display_errors' , 'On' );
error_reporting( E_ALL | E_STRICT );

if ( isset( $_GET[ 'l'] ) ){
$Letra = $_GET[ 'l' ];
//...
}

 

Outro ponto é em relação ao custo.

 

Para encontrar os nomes que começam com uma letra qualquer, sua busca tem custo n ou seja, você precisará, necessariamente, percorrer todos os elementos da a matriz, do início ao fim, em busca de nomes que comecem com tal letra.

 

Isso pode não ser um problema para matrizes curtas, mas imagine que você tenha milhões de registros e que apenas o segundo elemento contenha um nome que comece com tal letra. Você precisará percorrer toda a matriz para descobrir que só o segundo elemento continha um nome com tal inicial.

 

O simples ato de ordenar essa matriz, melhorará esse custo, causando no pior caso um custo n se você estiver buscando uma letra Z (último elemento) ou uma letra que não contenha nenhum nome com tal inicial, mas possui um caso médio de n/2.

 

Como no seu caso, você está trabalhando com mais de um elemento possível para cada caso, você terá um custo de c + nep ou, no médio caso, para 6 elementos possíveis, n/2 + 6.

 

<?php
$array = array(
'Ronny','Maicon','Allan','Norberto','Elisa','Beto','Cristielle','Camila', 'Aghata', 'Cristiane','Valeria','Sandra','Wanessa','Vanessa','Adilson','Liliane',
'Lucitania','Maria','Sebastian','Felipe','Bruno','Natali','Laurenice','Antonio','Ana','Nicole','Stephany','Bianca','Brenda','Clarinha','Cecilia','Dalila',
'Gisele','Guilherme','Glaucio','Fernanda','Adriana','Magali','Nivia','Noemia','Olivia','Paola','Patricia','Valeska','Walter','Yasmin','Xaquira','Sabrina',
'Patrick','Mariana','Haroldo','Heloisa','Edwirge','Eloisa','Acácia','Célia','Cristina','Chaylla','Angelica','Andressa','Amanda','Emilio','Giovana','Jacqueline',
'Katherina','Malka','Marta','Samira','Veralice','Wellington','Zenóbio','Zelinda','Iracema','Ivan','Isis','Isadora','Inacio','Ícaro','Henri','Quitéria','Quirino',
'Quenia','Quincas','Talia','Thauany','Teodoro','Talita','Theseo','Thayná','Tania','Tricia','Umberto','Priscila','Ursulina','Ubaldo','Ursula','Ubirajara'
);

sort( $array );

$char = ord( 'M' );
$total = count( $array );
$iteracoes = 0;
$correspondencias = 0;

for ( $i = 0 ; $i < $total ; ++$i ){
$charAt0 = ord( substr( $array[ $i ] , 0 , 1 ) );

++$iteracoes;

if ( $charAt0 == $char ){
	printf( "%s\n" , $array[ $i ] );
	++$correspondencias;
} elseif ( $charAt0 > $char ){
	break;
}
}

printf( "\nForam necessárias %d iterações em %d elementos para encontrar %d correspondências.\n\n" , $iteracoes , $total , $correspondencias );

 

A saída será:

Magali
Maicon
Malka
Maria
Mariana
Marta

Foram necessárias 53 iterações em 97 elementos para encontrar 6 correspondências.

 

Porém, esse custo ainda é alto para o pior caso, se estivermos procurando a letra Z, você ainda terá um custo de n:

 

Zelinda
Zenóbio

Foram necessárias 97 iterações em 97 elementos para encontrar 2 correspondências.

 

Como sua matriz estará ordenada, você pode fazer uma busca binária e percorrer sua matriz pelo centro, diminuindo a cada iteração, o tamanho da matriz, isso fará com que seu caso médio seja de log2(N) - 1:

 

<?php
$array = array(
'Ronny','Maicon','Allan','Norberto','Elisa','Beto','Cristielle','Camila', 'Aghata', 'Cristiane','Valeria','Sandra','Wanessa','Vanessa','Adilson','Liliane',
'Lucitania','Maria','Sebastian','Felipe','Bruno','Natali','Laurenice','Antonio','Ana','Nicole','Stephany','Bianca','Brenda','Clarinha','Cecilia','Dalila',
'Gisele','Guilherme','Glaucio','Fernanda','Adriana','Magali','Nivia','Noemia','Olivia','Paola','Patricia','Valeska','Walter','Yasmin','Xaquira','Sabrina',
'Patrick','Mariana','Haroldo','Heloisa','Edwirge','Eloisa','Acácia','Célia','Cristina','Chaylla','Angelica','Andressa','Amanda','Emilio','Giovana','Jacqueline',
'Katherina','Malka','Marta','Samira','Veralice','Wellington','Zenóbio','Zelinda','Iracema','Ivan','Isis','Isadora','Inacio','Ícaro','Henri','Quitéria','Quirino',
'Quenia','Quincas','Talia','Thauany','Teodoro','Talita','Theseo','Thayná','Tania','Tricia','Umberto','Priscila','Ursulina','Ubaldo','Ursula','Ubirajara'
);

function binarySearch( array $array , $e , &$it , &$c , $s = 0 , $n = null ){
if ( $n == null ) $n = count( $array );

$m = floor( ( $n + $s ) / 2 );
$char = ord( $e );
$charAtm = ord( substr( $array[ $m ] , 0 , 1 ) );

if ( $char == $charAtm ){
	$s = $m;
	$n = $m;

	//como estamos trabalhando com mais de um elemento possível, é necessário voltar
	//nosso centro para encontrar o primeiro elemento que corresponda à nossa busca
	while ( isset( $array[ $s - 1 ] ) && $char == ord( substr( $array[ $s - 1 ] , 0 , 1 ) ) ){
		++$it;
		--$s;
	}

	//a mesma coisa ocorre aqui, para encontrar o últime elemento que corresponda à nossa busca
	while ( isset( $array[ $n + 1 ] ) && $char == ord( substr( $array[ $n + 1 ] , 0 , 1 ) ) ){
		++$it;
		++$n;
	}

	for ( $i = $s ; $i <= $n ; ++$i ){
		$charAti = ord( substr( $array[ $i ] , 0 , 1 ) );

		++$it;

		if ( $charAti == $char ){
	 	printf( "%s\n" , $array[ $i ] );
	 	++$c;
		}
	}

	return;
} elseif ( $char > $charAtm ){
	$s = $m + 1;
} else {
	$n = $m - 1;
}

++$it;

binarySearch( $array , $e , $it , $c , $s , $n );
}

$it = 0;
$correspondencias = 0;

sort( $array );

binarySearch( $array , 'M' , $it , $correspondencias );

printf( "\nForam necessárias %d iterações em %d elementos para encontrar %d correspondências.\n\n" , $it , count( $array ) , $correspondencias );

 

Para a letra M, que em uma busca linear foram necessárias 53 iterações, em uma busca binária são necessárias apenas 11:

 

Magali
Maicon
Malka
Maria
Mariana
Marta

Foram necessárias 11 iterações em 97 elementos para encontrar 6 correspondências.

 

E para a letra Z, que antes eram necessárias 97 iterações, apenas 7 são necessárias em uma busca binária:

 

Zelinda
Zenóbio

Foram necessárias 7 iterações em 97 elementos para encontrar 2 correspondências.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse neto eh melhor q mto professor q eu tive :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

E com DB, isso mudaria?

 

Na prática sim, na teoria não.

 

Quando você cria um índice para uma coluna qualquer em uma tabela, o banco de dados faz isso para você.

 

Na prática, você diria para um banco de dados relacional:

 

 SELECT `nomePessoa` FROM `Pessoa` WHERE `nomePessoa` LIKE "M%"; 

 

Ou seja:

mysql> CREATE TABLE `Pessoa` (
-> `idPessoa` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
-> `nomePessoa` VARCHAR(50) NOT NULL ,
-> PRIMARY KEY (`idPessoa`) ,
-> INDEX `nomes` USING BTREE (`nomePessoa` ASC)
-> );
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO `Pessoa`(`nomePessoa`) VALUES("Ronny"),("Maicon"),("Allan"),("Norberto"),("Elisa"),("Beto"),("Cristielle"),("Camila"),("Aghata"),("Cristiane"),("Valeria"),("Sandra"),("Wanessa"),("Vanessa"),("Adilson"),("Liliane"),("Lucitania"),("Maria"),("Sebastian"),("Felipe"),("Bruno"),("Natali"),("Laurenice"),("Antonio"),("Ana"),("Nicole"),("Stephany"),("Bianca"),("Brenda"),("Clarinha"),("Cecilia"),("Dalila"),("Gisele"),("Guilherme"),("Glaucio"),("Fernanda"),("Adriana"),("Magali"),("Nivia"),("Noemia"),("Olivia"),("Paola"),("Patricia"),("Valeska"),("Walter"),("Yasmin"),("Xaquira"),("Sabrina"),("Patrick"),("Mariana"),("Haroldo"),("Heloisa"),("Edwirge"),("Eloisa"),("Acácia"),("Célia"),("Cristina"),("Chaylla"),("Angelica"),("Andressa"),("Amanda"),("Emilio"),("Giovana"),("Jacqueline"),("Katherina"),("Malka"),("Marta"),("Samira"),("Veralice"),("Wellington"),("Zenóbio"),("Zelinda"),("Iracema"),("Ivan"),("Isis"),("Isadora"),("Inacio"),("Ícaro"),("Henri"),("Quitéria"),("Quirino"),("Quenia"),("Quincas"),("Talia"),("Thauany"),("Teodoro"),("Talita"),("Theseo"),("Thayná"),("Tania"),("Tricia"),("Umberto"),("Priscila"),("Ursulina"),("Ubaldo"),("Ursula"),("Ubirajara");
Query OK, 97 rows affected (0.17 sec)
Records: 97 Duplicates: 0 Warnings: 0

mysql> SELECT `nomePessoa` FROM `Pessoa` WHERE `nomePessoa` LIKE "M%";
+------------+
| nomePessoa |
+------------+
| Magali 	|
| Maicon 	|
| Malka 	|
| Maria 	|
| Mariana	|
| Marta 	|
+------------+
6 rows in set (0.00 sec)

 

Nesse caso, o índice criado foi de uma árvore, mas todo o processo de busca é feito e o resultado lhe é entregue da forma que você espera.

 

O grande ponto aqui, não é o banco fazer o trabalho para você, é que o trabalho deverá ser feito em algum momento e, compreender o que será feito, ajudará a reduzir o custo e, consequentemente, melhorará o desempenho da aplicação e a experiência do usuário que a utilizará.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para ordenar usei a função sort() e vejam abaixo como fico o código

 

 

<?php   
$Letra = $_GET[l];

$array = array(
               "Ronny","Maicon","Allan","Norberto","Elisa","Beto","Cristielle","Camila", "Aghata", "Cristiane","Valeria","Sandra","Wanessa","Vanessa","Adilson","Liliane",
               "Lucitania","Maria","Sebastian","Felipe","Bruno","Natali","Laurenice","Antonio","Ana","Nicole","Stephany","Bianca","Brenda","Clarinha","Cecilia","Dalila",
               "Gisele","Guilherme","Glaucio","Fernanda","Adriana","Magali","Nivia","Noemia","Olivia","Paola","Patricia","Valeska","Walter","Yasmin","Xaquira","Sabrina",
               "Patrick","Mariana","Haroldo","Heloisa","Edwirge","Eloisa","Acácia","Célia","Cristina","Chaylla","Angelica","Andressa","Amanda","Emilio","Giovana","Jacqueline",
               "Katherina","Malka","Marta","Samira","Veralice","Wellington","Zenóbio","Zelinda","Iracema","Ivan","Isis","Isadora","Inacio","Ícaro","Henri","Quitéria","Quirino",
               "Quenia","Quincas","Talia","Thauany","Teodoro","Talita","Theseo","Thayná","Tania","Tricia","Umberto","Priscila","Ursulina","Ubaldo","Ursula","Ubirajara"
               );

$alfabeto = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");

$total = count($array);

sort($array);
echo "[ <a href='array_foreach_letra.php' >[ VER TODOS ]</a> ]  "; foreach ($alfabeto as $link) {      print "[ <a href='?l={$link[0]}' >{$link[0]}</a> ]  "; }
echo "<br/>";
echo "{$total} Nomes Cadastrados! <br/>";
echo "<br/><br/>";

if (isset($Letra)) {
foreach ($array as $nome) {
               if($nome[0] ==  $Letra) {
                       echo "{$nome} <br/>";
               }
}
}

else {
       foreach ($array as $nome) {
                       echo"{$nome} <br/>";
       }
}
?>

 

Link para demosntração: http://dev.danielhsa...om/arquivos/01/

 

desculpe pessoal mais arrumei não prestei atenção e n savei o arvio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lembrando que, a partir da análise feita pelo João, temos a análise assimptótica, ou notação do Grande-O, para representarmos o custo ou ordem de crescimento de seu algorítmo.

 

A ideia base é sempre tentar reduzir a ordem de crescimento ou custo de seu algorítmo na escala de classes de funções da análise assimptótica.

 

No exemplo dado, a classe de ordem constante, O(1), é menos custosa que a de ordem logarítmica O(logn) para entradas pequenas.

 

Porém, à medida que ocorre o crescimento da entrada n, temos um ganho de custo claro na ordem logarítmica, portanto, neste caso, ela é melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para ordenar usei a função sort() e vejam abaixo como fico o código

 

shuffle($array);

 

<_<

 

:seta: shuffle()

 

Um exemplo de código completo, ainda utilizando matrizes, porém otimizado:

 

<?php
function binarySearch( array $array , array &$result , $e , $s = 0 , $n = null ) {
if ( $n == null ) $n = count( $array );

$m = floor( ( $n + $s ) / 2 );

if ( isset( $array[ $m ] ) ){
	$char = ord( $e );
	$charAtm = ord( substr( $array[ $m ] , 0 , 1 ) );

	if ( $char == $charAtm ) {
		$s = $m;
		$n = $m;

		while ( isset( $array[ $s - 1 ] ) && $char == ord( substr( $array[ $s - 1 ] , 0 , 1 ) ) ) --$s;
		while ( isset( $array[ $n + 1 ] ) && $char == ord( substr( $array[ $n + 1 ] , 0 , 1 ) ) ) ++$n;

		for ( $i = $s ; $i <= $n ; ++$i ) $result[] = $array[ $i ];

		return;
	} elseif ( $char > $charAtm ) {
		$s = $m + 1;
	} else {
		$n = $m - 1;
	}

	binarySearch( $array , $result , $e , $s , $n );
}
}

$alfabeto = range( 'A' , 'Z' );
$result = array();
$array = array(
'Ronny','Maicon','Allan','Norberto','Elisa','Beto','Cristielle','Camila', 'Aghata', 'Cristiane','Valeria','Sandra','Wanessa','Vanessa','Adilson','Liliane',
'Lucitania','Maria','Sebastian','Felipe','Bruno','Natali','Laurenice','Antonio','Ana','Nicole','Stephany','Bianca','Brenda','Clarinha','Cecilia','Dalila',
'Gisele','Guilherme','Glaucio','Fernanda','Adriana','Magali','Nivia','Noemia','Olivia','Paola','Patricia','Valeska','Walter','Yasmin','Xaquira','Sabrina',
'Patrick','Mariana','Haroldo','Heloisa','Edwirge','Eloisa','Acácia','Célia','Cristina','Chaylla','Angelica','Andressa','Amanda','Emilio','Giovana','Jacqueline',
'Katherina','Malka','Marta','Samira','Veralice','Wellington','Zenóbio','Zelinda','Iracema','Ivan','Isis','Isadora','Inacio','Ícaro','Henri','Quitéria','Quirino',
'Quenia','Quincas','Talia','Thauany','Teodoro','Talita','Theseo','Thayná','Tania','Tricia','Umberto','Priscila','Ursulina','Ubaldo','Ursula','Ubirajara'
);

sort( $array );

// Controlador
if ( isset( $_GET[ 'l' ] ) ){
if ( $_GET[ 'l' ] >= 'A' && $_GET[ 'l' ] <= 'Z' ){
	binarySearch( $array , $result , $_GET[ 'l' ] );
}
} else {
$result = $array;
}

// Exibição
$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Exemplo</title>
	<style type="text/css">
		a {
			margin-right: 10px;
			text-decoration: none;
		}
		ul.menu li {
			display : inline;
		}
	</style>
</head>
<body>
	<h1>Exemplo</h1>
	<div>
		<ul class="menu">
			<li><a href="?todos">Ver Todos</a></li>
			<li><a href="?l=A">A</a></li>
			<li><a href="?l=B">B</a></li>
			<li><a href="?l=C">C</a></li>
			<li><a href="?l=D">D</a></li>
			<li><a href="?l=E">E</a></li>
			<li><a href="?l=F">F</a></li>
			<li><a href="?l=G">G</a></li>
			<li><a href="?l=H">H</a></li>
			<li><a href="?l=I">I</a></li>
			<li><a href="?l=J">J</a></li>
			<li><a href="?l=K">K</a></li>
			<li><a href="?l=L">L</a></li>
			<li><a href="?l=M">M</a></li>
			<li><a href="?l=N">N</a></li>
			<li><a href="?l=O">O</a></li>
			<li><a href="?l=P">P</a></li>
			<li><a href="?l=Q">Q</a></li>
			<li><a href="?l=R">R</a></li>
			<li><a href="?l=S">S</a></li>
			<li><a href="?l=T">T</a></li>
			<li><a href="?l=U">U</a></li>
			<li><a href="?l=V">V</a></li>
			<li><a href="?l=W">W</a></li>
			<li><a href="?l=X">X</a></li>
			<li><a href="?l=Y">Y</a></li>
			<li><a href="?l=Z">Z</a></li>
		</ul>
		<hr />
		<ul>
			<li>%s</li>
		</ul>
	</div>
</body>
</html>
HTML;

printf( $html , implode( '</li><li>' , $result ) );

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola amigos... um 2011 de muito SUCESSO para todos...

 

Vi que i POST rendeu um pouco, mais pelo que vi, a melhor maneira é com DB mesmo, não vejo pq fazer com matrizes, sendo que com DB, teria uma autonomia muito melhor.

 

Vlw

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.