
Randomizar A Ordem Das Imagens
Started By luizbaca, 14/01/2009, 13:31
10 replies to this topic
#1
Posted 14/01/2009, 13:31
Bom galera, preciso incomodá-los.... É o seguinte:
Tenho na página inicial do meu site as logomarcas dos meus patrocinadores. Queria que elas aparecesse em ordem aleatoria cada vez q fosse recarregada a página. Sei do comando rand em php mas nao consegui executar com sucesso meu objetivo, por isso recorri ao Forum WMO que nunca me deixou na mão!!
Obrigado pela atenção
Luiz Bacarin
se quiserem ver, o site é www.cidadeemfesta.com.br
Tenho na página inicial do meu site as logomarcas dos meus patrocinadores. Queria que elas aparecesse em ordem aleatoria cada vez q fosse recarregada a página. Sei do comando rand em php mas nao consegui executar com sucesso meu objetivo, por isso recorri ao Forum WMO que nunca me deixou na mão!!
Obrigado pela atenção
Luiz Bacarin
se quiserem ver, o site é www.cidadeemfesta.com.br
#2
Posted 14/01/2009, 14:13
Bem, uma idéia rápida:
Você tem total de patrocinadores, certo?
Supondo que sejam 10 patrocinadores, você manda executar o rand entre 1 e 10. Ele vai pegar um desses número aleatóriamente. Agora, você colocar num array o endereço de cada logo, sendo:
$patocinador[1] = "imagem.jpg";
$patocinador[2] = "imagem.jpg";
$patocinador[3] = "imagem.jpg";
$patocinador[10] = "imagem.jpg";
$gerado = rand(1,10); <<<< não lembro a sintaxe
echo $patocinador[$gerado];
Mais ou menos assim.
Se estiver num BD, é só adaptar.
Espero ter ajudado.
Você tem total de patrocinadores, certo?
Supondo que sejam 10 patrocinadores, você manda executar o rand entre 1 e 10. Ele vai pegar um desses número aleatóriamente. Agora, você colocar num array o endereço de cada logo, sendo:
$patocinador[1] = "imagem.jpg";
$patocinador[2] = "imagem.jpg";
$patocinador[3] = "imagem.jpg";
$patocinador[10] = "imagem.jpg";
$gerado = rand(1,10); <<<< não lembro a sintaxe
echo $patocinador[$gerado];
Mais ou menos assim.
Se estiver num BD, é só adaptar.
Espero ter ajudado.
Edição feita por: Humberto Rodrigues, 14/01/2009, 14:15.
#3
Posted 14/01/2009, 15:39
Se estiver gravado em banco de dados diz aí
eu tenho uma dica melhor do que colocar order by rand() na query, pois este fica lento dependendo do número de registros.
Até mais
eu tenho uma dica melhor do que colocar order by rand() na query, pois este fica lento dependendo do número de registros.

Crab - Ex-Administrador Geral fórum WMO
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
#4
Posted 14/01/2009, 15:51
Opa, então diz ai Crab, pra mim com certeza vai ser útil. 
Até mais

Até mais
#5
Posted 14/01/2009, 19:00
ORDER BY RAND() funciona perfeitamente, estou usando ela com LIMIT num trabalho aqui.
Se as imagens não estiverem no banco de dados...
Inventei isso aqui:
Faça um teste aí, está aprovado por mim.
Se as imagens não estiverem no banco de dados...

Inventei isso aqui:
$p = array("imagem1.jpg", "imagem2.jpg", "imagem3.jpg"); // Todas as imagens aqui $c = count($p); // Retorna a quantidade de imagens que tem no array $r = array_rand($p,$c); // Retorna chaves randômicas // Inicia o loop para exibir as imagens for ($i=0; $i<$c; $i++) { echo '<img src="'. $p[$r[$i]] .'" alt="" />'; }
Faça um teste aí, está aprovado por mim.

att,
Muller Dias
ex-administrador Fórum WMO
Muller Dias
ex-administrador Fórum WMO
#6
Posted 14/01/2009, 20:34
Não sei ainda se tem banco de dados... se não tiver a dica não vale de nada para o amigo ali mas serve como base de estudo talvez...
Como eu disse, o que fará valer a pena buscar alternativas para o ORDER BY RAND() é a real necessidade, como muitos registrosa por exemplo... se forem poucos registros é insignificante a difenrença, mas se for com 10.000 para cima pode fazer uma grande diferença
Esse link quem me passou foi o Eclesiastes a uns 2 anos atrás mais ou menos... é interessante:
Veja nesse link a dica... http://jan.kneschke..../order-by-rand/ ( INGLÊS )
No final da página eles colocam um teste de performance comparativo entre 3 tipos de query exemplificadas no link
Até mais
Opa, então diz ai Crab, pra mim com certeza vai ser útil.
Como eu disse, o que fará valer a pena buscar alternativas para o ORDER BY RAND() é a real necessidade, como muitos registrosa por exemplo... se forem poucos registros é insignificante a difenrença, mas se for com 10.000 para cima pode fazer uma grande diferença
Esse link quem me passou foi o Eclesiastes a uns 2 anos atrás mais ou menos... é interessante:
Veja nesse link a dica... http://jan.kneschke..../order-by-rand/ ( INGLÊS )
No final da página eles colocam um teste de performance comparativo entre 3 tipos de query exemplificadas no link
Performance Now let's see what happends to our performance. We have 3 different queries for solving our problems. * Q1. ORDER BY RAND() * Q2. RAND() * MAX(ID) * Q3. RAND() * MAX(ID) + ORDER BY ID Q1 is expected to cost N * log2(N), Q2 and Q3 are nearly constant. The get real values we filled the table with N rows ( one thousand to one million) and executed each query 1000 times. 100 1.000 10.000 100.000 1.000.000 Q1 0:00.718s 0:02.092s 0:18.684s 2:59.081s 58:20.000s Q2 0:00.519s 0:00.607s 0:00.614s 0:00.628s 0:00.637s Q3 0:00.570s 0:00.607s 0:00.614s 0:00.628s 0:00.637s As you can see the plain ORDER BY RAND() is already behind the optimized query at only 100 rows in the table.

Crab - Ex-Administrador Geral fórum WMO
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
#7
Posted 14/01/2009, 21:00
Fala galera!!
Muito bom!!!
Valeu mesmo!! Funcionou certinho!
acessem pra ver http://www.cidadeemfesta.com.br
só o css no firefox que não ficou muito bom, mas tá bom, tá bom kkkk
abraço a todos!!!
Muito bom!!!
Valeu mesmo!! Funcionou certinho!
acessem pra ver http://www.cidadeemfesta.com.br
só o css no firefox que não ficou muito bom, mas tá bom, tá bom kkkk
abraço a todos!!!
#8
Posted 14/01/2009, 22:28
100 1.000 10.000 100.000 1.000.000 Q1 0:00.718s 0:02.092s 0:18.684s 2:59.081s 58:20.000s Q2 0:00.519s 0:00.607s 0:00.614s 0:00.628s 0:00.637s Q3 0:00.570s 0:00.607s 0:00.614s 0:00.628s 0:00.637s
2:59.081s seria 2 minutos e 59 segundos?

Deixa seu marketing de lado


Quando tem poucas linhas eu percebi que a diferença realmente é pequena. Mas não seria melhor usar as outras formas invés de ORDER BY RAND()? Porque mesmo se tiver poucas linhas, a performance continuará sendo melhor e às vezes não tem como a gente saber a quantidade de registros que haverá nas tabela, por via das dúvidas é melhor usar uma das alternativas.
Não existe uma versão pt-BR desse artigo não?

Aproveitando, como vocês fazem esses testes de performance?
att,
Muller Dias
ex-administrador Fórum WMO
Muller Dias
ex-administrador Fórum WMO
#9
Posted 15/01/2009, 00:23
Olha só, vou mostrar um exemplo de como eu utilizo.
Acho que =difere um pouco da funcionalidade que o amigo do tópico queria, pois acho que ele queria exibir as fotos de uma galeria e eu uso para seguinte:
Tenho nome das fotos cadastradas no banco de dados e relacionadas cada foto com sua galeria.
Fiz o sistema para que o cliente que o utilizasse, pudesse dispor na página inicial do site uma chamada com as últimas galerias cadastradas e tals... até aí simples.
Mas o problema era que eu queria exibir como imagem destaque, aquela que representaria a chamada da galeria, de uma forma mais justa e democrática
qual forma??
Bom, obviamente cada galeria tem um grupo de fotos, então seria muita injustiça com as outras fotos se elas não tivessem a mesma chance de aparecer na capa do site.
Então tinah que implementar a query para que a foto destaque, representante da galeria, fosse exibida de forma aleatória entre as fotos da galeria.
como fiz isso???
Primeiro... msn trocando idéia com quem sabia cheguei a compreensão de utilizar uma forma de sorteio mais eficiente que ORDER BY RAND()
Logo só pude acreditar que havia falado com 'o mago'... kkkkkkkkkkkkkkk o cara é fera...
Ele que me passou esse link aí e me deu uma força na época...
até porque como eu ia entender essa parafernalha toda...
hoje entendo, mas 2 anos atrás...
... cabeça dura pra sacar o funcionamento disso heheheheh
Bom... vamos a query propriamente dita que irá fazer isso que descrevi acima.
Isso exibiria 6 imagens na página, cada uma representando a sua galeria
Se aplicar um F5 com certeza algumas ou todas as fotos mudariam, as chances de não se repetir com frequência aumenta de acordo com a quantidade de fotos que tiver em sua respectiva galeria.
Até mais
Acho que =difere um pouco da funcionalidade que o amigo do tópico queria, pois acho que ele queria exibir as fotos de uma galeria e eu uso para seguinte:
Tenho nome das fotos cadastradas no banco de dados e relacionadas cada foto com sua galeria.
Fiz o sistema para que o cliente que o utilizasse, pudesse dispor na página inicial do site uma chamada com as últimas galerias cadastradas e tals... até aí simples.
Mas o problema era que eu queria exibir como imagem destaque, aquela que representaria a chamada da galeria, de uma forma mais justa e democrática

qual forma??
Bom, obviamente cada galeria tem um grupo de fotos, então seria muita injustiça com as outras fotos se elas não tivessem a mesma chance de aparecer na capa do site.

Então tinah que implementar a query para que a foto destaque, representante da galeria, fosse exibida de forma aleatória entre as fotos da galeria.
como fiz isso???
Primeiro... msn trocando idéia com quem sabia cheguei a compreensão de utilizar uma forma de sorteio mais eficiente que ORDER BY RAND()
Logo só pude acreditar que havia falado com 'o mago'... kkkkkkkkkkkkkkk o cara é fera...
Ele que me passou esse link aí e me deu uma força na época...
até porque como eu ia entender essa parafernalha toda...
hoje entendo, mas 2 anos atrás...

Bom... vamos a query propriamente dita que irá fazer isso que descrevi acima.
SELECT tabG.*, date_format(tabG.data, '%d/%m/%Y') AS dataEvento, tabI.imagem FROM tab_galerias AS tabG, tab_imagens AS tabI WHERE tabG.idgaleria = tabI.idgaleria AND (tabI.idimagem) >= ( SELECT CEIL(MAX(idimagem) * RAND()) FROM tab_imagens AS tabI2 WHERE tabI2.idgaleria = tabG.idgaleria ) GROUP BY tabG.idgaleria DESC LIMIT 6
Isso exibiria 6 imagens na página, cada uma representando a sua galeria
Se aplicar um F5 com certeza algumas ou todas as fotos mudariam, as chances de não se repetir com frequência aumenta de acordo com a quantidade de fotos que tiver em sua respectiva galeria.

Crab - Ex-Administrador Geral fórum WMO
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
canaldev.com.br
sistemabasico.com.br
twitter.com/sistemabasico
twitter.com/lunelli
#10
Posted 15/01/2009, 22:37
Crab, estou tentando entender esse negócio aí...
É a primeira vez que vejo uma query dentro de outra, não sabia que isso era possível.
Só a linha acima que é nova para mim, o restante eu consigo entender. O que isso aí faz exatamente?
É a primeira vez que vejo uma query dentro de outra, não sabia que isso era possível.
CEIL(MAX(idimagem) * RAND())
Só a linha acima que é nova para mim, o restante eu consigo entender. O que isso aí faz exatamente?

att,
Muller Dias
ex-administrador Fórum WMO
Muller Dias
ex-administrador Fórum WMO
#11
Posted 16/01/2009, 07:16
CEIL(MAX(idimagem) * RAND())
CEIL: arredonda frações para cima
MAX: obtém o maior valor do campo informado
RAND: obtém um valor aleatório
Ou seja, contextualizando, como RAND() retorna um valor entre 0 e 1, é preciso, após multiplicá-lo pelo maior elemento de idimagem, arredondar para encontrar um valor real na tabela.
Acredito ser isto.

[]'sAté mais
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)