Ir para conteúdo

POWERED BY:

Arquivado

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

Antonio Jorge

Rand sem repetição até o último aparecer!

Recommended Posts

Show, parece funcionar muito bem, é infinito? Terminou todos os termos volta a repetir?

 

O objetivo

 

Eu tenho um site onde baixa arquivo da rede 4shared usando a api do 4shared, mas a minha conta premium vai termina muito rápido, então eu descobri que usuário free tem um limite para gerar arquivos preview via api, então eu criei 10 conta free, mas de nada adianta se a rand setar a mesma conta várias vezes já que tem para isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, entendi. Nesse caso seria melhor você armazenar a variável que possui os itens bloqueados num cookie ou numa session ou ainda num banco de dados. da forma que eu te dei agora ele ainda vai repetir o resultado de vez em quando. essa que te dei, é uma solução melhor pra caso você só vá imprimir os resultados da array.

de forma MUITO simples, usando cokies pra armazenar a array com os itens bloqueados:

$array = array("termo1","termo2","termo3","termo4","termo5","termo6","termo7","termo8","termo9","termo10","termo11","termo12");

$termina = count($array); // para definir a inicialização e finalização do loop

/* verifica se o cookie com a lista de bloqueio existe. Do contrário, define uma array vazia, permitindo qualquer resultado no rand() */
if(isset($_COOKIE["bloqueia"])){
  $bloqueia = unserialize($_COOKIE["bloqueia"]);
}else{
  $bloqueia = array(); /* cria a lista de índices bloqueados, para não repetir */
}

$i = 0;

while($termina <= count($array)){
  $indice = rand(0,11); /* para iniciar do índice 0 da array, percorrendo aleatoriamente até o final */
    if(!in_array($indice,$bloqueia){
       $final = $array[$indice];
       $bloqueia[$i] = $indice; /* Bloqueia o índice que acaba de ser escolhido pelo rand() */
       $i++;
       $termina++;
       setcookie("bloqueia", serialize($bloqueia), time()+172800);
    }
}

echo $final;

 

To sem como testar. Qualquer coisa avisa aqui. Mas amanhã eu to em casa pelo fim da tarde, aí fica mais fácil te ajudar podendo testar antes de postar e tal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse deu o erro de header, veja:

Warning: in_array() expects parameter 2 to be array, string given in /home/antonio/public_html/musica/termo.php on line 17

Warning: Cannot modify header information - headers already sent by (output started at /home/antonio/public_html/musica/termo.php:17) in /home/antonio/public_html/musica/termo.php on line 22
termo3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei um edit ali porque realmente eu tinha errado sem serializar a array antes de passar ela pro cookie, vê se funciona do jeito que tá agora. Coloquei um ob_start por causa do header():

ob_start();
$array = array("termo1","termo2","termo3","termo4","termo5","termo6","termo7","termo8","termo9","termo10","termo11","termo12");

$termina = count($array); // para definir a inicialização e finalização do loop

/* verifica se o cookie com a lista de bloqueio existe. Do contrário, define uma array vazia, permitindo qualquer resultado no rand() */
if(isset($_COOKIE["bloqueia"])){
  $bloqueia = unserialize($_COOKIE["bloqueia"]);
}else{
  $bloqueia = array(); /* cria a lista de índices bloqueados, para não repetir */
}

$i = 0;

while($termina <= count($array)){
  $indice = rand(0,11); /* para iniciar do índice 0 da array, percorrendo aleatoriamente até o final */
    if(!in_array($indice,$bloqueia){
       $final = $array[$indice];
       $bloqueia[$i] = $indice; /* Bloqueia o índice que acaba de ser escolhido pelo rand() */
       $i++;
       $termina++;
       setcookie("bloqueia", serialize($bloqueia), time()+172800);
    }
}

echo $final;
ob_end_flush();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acabei de perceber que faltou uma ) pra fechar o if na linha 18, é só consertar deixando assim:

/*linha 18 */    if(!in_array($indice,$bloqueia)){

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo, mudando o limite do rand() você aumenta o número de resultados possíveis ;)

E é bom também sempre trabalhar (sempre que possível) com o ob_start(), ele salva muito as nossas vidas. Se precisar de uma base sobre ele, veja este site aqui.
.

 

Qualquer coisa estamos aí, amigão. Té mais \o

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.