Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Ola Daniel, não tenho tanta experiencia com programação, e ordenação com array, nunca vi.
Caso você saiba, faça ai.
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:
Para gerar o array do alfabeto, pode usar range()
>
<?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; 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; $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.
;)
Esse neto eh melhor q mto professor q eu tive :clap:
Meio complexo para iniciantes, mais bem interessante.
E com DB, isso mudaria? Precisaria disso tudo?
Vlw!
>
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á.
;)
Achei mais interessante.
É isso ai, muito obrigado!
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
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.
mais sem fazer a combinação binária que o João usou, essa forma é a mais simples de ter uma lista ordenada
>
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(););
sort( $array );
// Controlador
if ( isset( $_GET[ 'l' ] ) ){
if ( $_GET[ 'l' ] >= 'A' && $_GET[ 'l' ] <= 'Z' ){
binarySearch( $array , $result , $_GET[ 'l' ] );
}$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 ) );
;)Foi um erro João rsrsrs, foi falta de prestar atenção mais já arrumei
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
Agora faça a ordenação desses nomes!