Jump to content


Photo

Randomizar A Ordem Das Imagens


  • Faça o login para participar
10 replies to this topic

#1 luizbaca

luizbaca

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado

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

#2 Humberto Rodrigues

Humberto Rodrigues

    Turista

  • Usuários
  • 59 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro

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.

Edição feita por: Humberto Rodrigues, 14/01/2009, 14:15.


#3 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

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

#4 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 14/01/2009, 15:51

Opa, então diz ai Crab, pra mim com certeza vai ser útil. :D

Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#5 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

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... :ponder:

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. :P
att,
Muller Dias
ex-administrador Fórum WMO

#6 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

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...

Opa, então diz ai Crab, pra mim com certeza vai ser útil. :D


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.

(y)Até mais

#7 luizbaca

luizbaca

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado

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!!!

#8 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

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? :ponder:

Deixa seu marketing de lado :P, vai ter explicar isso aí porque eu não entendo inglês... :D

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

#9 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

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 :D

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. :D

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... :assobio: ... cabeça dura pra sacar o funcionamento disso heheheheh

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.

(y)Até mais

#10 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

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.

CEIL(MAX(idimagem) * RAND())

Só a linha acima que é nova para mim, o restante eu consigo entender. O que isso aí faz exatamente? :ponder:
att,
Muller Dias
ex-administrador Fórum WMO

#11 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

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
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq