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

Bom pessoal precisando de ajuda novamente para variar, kkkkk

Eu tenho um sistema que usa as palavras disponibilizado pelo rand, mas eu queria que todas as palavras aparecessem antes de repetir.

Atualmente aparece aleatoriamente, e muitas das vezes repetir o mesmo termo várias vezes.

Teria como força aparacer todas que não apareceram e quando termina reiniciar aleatoriamente novamente?

 

Compliquei? kkkkkkkk

 

 

$array = array("termo1","termo2","termo3","termo4","termo5","termo6,"termo7","termo8","termo9","termo10","termo11","termo12");
$k = array_rand($array,1);
$usuario = $array[$k];

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece que a repetição não se dar através de um laço, mas pelas requisições HTTP, né...?

 

Então você pode colocar uma cópia desse array numa variável de sessão ou serializado em um cookie. Cada vez que um for usado você o exclui do cookie/sessão e quando este array estiver vazio, você o realimenta com uma nova cópia.

 

Compliquei?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando um cookie:

 

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

// Resgata o array do navegador, se existir
// senão, usa o $termos
$array = isset($_COOKIE['termos']) ? unserialize($_COOKIE['termos']) : $termos;

// Realimenta o array se estiver vazio
if (empty($array)) {
    $array = $termos;
}

// Sorteia um termo (seu código)
$k = array_rand($array, 1);
$usuario = $array[$k];

// Remove o termo usado do array
unset($array[$k]);

// Serializa o array
$array_serializado = serialize($array);

// Manda de volta para o navegador
setcookie("termos", $array_serializado);


echo $usuario;

 

Resultado: sempre um termo inédito até concluir toda a lista e quando isso ocorrer, a lista é reiniciada.

 

 

Teste aí e me diga se serve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde amigo, coloquei mas não surtiu efeito veja a resposta que tive:

 

 

8
1
2
3
3
3
4
9
8
1
4
2
4
1
8
4
Veja que repetiu e não mostrou alguns em 16 atualizações de página.
Mas agradeço muito pela tentativa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui funcionou. Certifique-se de que seu navegador não está bloqueando os cookies ou tente em outro navegador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, veja que estranho coloquei ele online:

 

http://tectonny.com/musica/termo.php

 

<?
$termos = array("termo1","termo2","termo3","termo4","termo5","termo6","termo7","termo8","termo9","termo10","termo11","termo12");
 
// Resgata o array do navegador, se existir
// senão, usa o $termos
$array = isset($_COOKIE['termos']) ? unserialize($_COOKIE['termos']) : $termos;
 
// Realimenta o array se estiver vazio
if (empty($array)) {
    $array = $termos;
}
 
// Sorteia um termo (seu código)
$k = array_rand($array, 1);
$usuario = $array[$k];
 
// Remove o termo usado do array
unset($array[$k]);
 
// Serializa o array
$array_serializado = serialize($array);
 
// Manda de volta para o navegador
setcookie("termos", $array_serializado);
 
 
echo $usuario;

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece ser algum problema em seu servidor...

 

Tente usar a tag completa <?php, no lugar de apenas <?

 

Se mesmo assim não resolver, faça também um upload de um arquivo chamado echo.php para a mesma página e com esse conteúdo:

 

<?php echo "alguma coisa"; ?>

 

e tente rodá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que o cookie é trafegado com os dados convertidos.

 

troque

// Resgata o array do navegador, se existir
// senão, usa o $termos
$array = isset($_COOKIE['termos']) ? unserialize($_COOKIE['termos']) : $termos;

por

printf('há cookies? %s<br>', isset($_COOKIE['termos']) ? 'sim' : 'não');

if (isset($_COOKIE['termos'])) {
    echo 'o cookie vai ser convertido para isso aqui: <pre>';
    echo print_r(unserialize($_COOKIE['termos']), true);
    echo '</pre>';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu erro, veja:

 

http://tectonny.com/musica/termo.php

 

Código completo:

<?php
$termos = array("termo1","termo2","termo3","termo4","termo5","termo6","termo7","termo8","termo9","termo10","termo11","termo12");
 
printf('há cookies? %s<br>', isset($_COOKIE['termos']) ? 'sim' : 'não');

if (isset($_COOKIE['termos'])) {
    echo 'o cookie vai ser convertido para isso aqui: <pre>';
    echo print_r(unserialize($_COOKIE['termos']), true);
    echo '</pre>';
}
 
// Realimenta o array se estiver vazio
if (empty($array)) {
    $array = $termos;
}
 
// Sorteia um termo (seu código)
$k = array_rand($array, 1);
$usuario = $array[$k];
 
// Remove o termo usado do array
unset($array[$k]);
 
// Serializa o array
$array_serializado = serialize($array);
 
// Manda de volta para o navegador
setcookie("termos", $array_serializado);
 
 
echo $usuario;
echo "<br> Alguma Coisa";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certifique-se de que não tem nenhum espaço em branco antes de <?php

 

 

E...

 

 

troque isso

 

if (isset($_COOKIE['termos'])) {
    echo 'o cookie vai ser convertido para isso aqui: <pre>';
    echo print_r(unserialize($_COOKIE['termos']), true);
    echo '</pre>';
}

 

 

Por isso

 

$saida = "";
if (isset($_COOKIE['termos'])) {
    $saida .= 'o cookie vai ser convertido para isso aqui: <pre>';
    $saida .= print_r(unserialize($_COOKIE['termos']), true);
    $saida .= '</pre>';
}

 

 

 

E antes de

 

echo $usuario;

 

 

Coloque isso:

 

echo $saida;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem espaços veja a cópia fiel abaixo, e fiz a edição.

 

<?php
$termos = array("termo1","termo2","termo3","termo4","termo5","termo6","termo7","termo8","termo9","termo10","termo11","termo12");
printf('há cookies? %s<br>', isset($_COOKIE['termos']) ? 'sim' : 'não');

$saida = "";
if (isset($_COOKIE['termos'])) {
    $saida .= 'o cookie vai ser convertido para isso aqui: <pre>';
    $saida .= print_r(unserialize($_COOKIE['termos']), true);
    $saida .= '</pre>';
}
 
// Realimenta o array se estiver vazio
if (empty($array)) {
    $array = $termos;
}
 
// Sorteia um termo (seu código)
$k = array_rand($array, 1);
$usuario = $array[$k];
 
// Remove o termo usado do array
unset($array[$k]);
 
// Serializa o array
$array_serializado = serialize($array);
 
// Manda de volta para o navegador
setcookie("termos", $array_serializado);
 
echo $saida;
echo $usuario;
echo "<br> Alguma Coisa";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique pelo índice que foi escolhido na Array. Por exemplo, se o termo1 foi o escolhido da vez, proíba que ele seja escolhido novamente no loop. Eu faria assim:

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

$termina = 1; // para definir a inicialização e finalização do loop
$final = ""; // a variável que irá conter a saída do código
$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].PHP_EOL;
       $bloqueia[$i] = $indice; /* Bloqueia o índice que acaba de ser escolhido pelo rand() */
       $i++;
       $termina++;
    }
}

echo $final;

 

Dessa forma, o loop é repetido até que os 12 índices tenham sido escolhidos pelo rand(). To sem ter como testar, mas dá uma olhada aí e vê se funciona.

 

Maaaaas... por que randomizar se, no fim, vais mostrar todos os índices? O.o

Uma pergunta: quantas vezes o loop deve ser feito? Dessa vez me refiro ao total de vezes que todos os 12 nomes devem aparecer. Na postagem #1 você disse que teria que mostrar todos os nomes antes de repetir a array, então quantas vezes a array deve ser mostrada?

 

"Teria como força aparacer todas que não apareceram e quando termina reiniciar aleatoriamente novamente?"

Essa foi a parte que eu não entendi..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, sim. Nesse caso os 12 vão aparecer de uma só vez, mas aí é só pra você testar mesmo e ver que nenhum deles se repete. Pra mostrar um só é só você tirar o .= e trocar por =, na variável $final. Nessa parte abaixo:

// Em vez disso:
    if(!in_array($indice,$bloqueia)){
       $final .= $array[$indice].PHP_EOL;

// Coloque isso:
    if(!in_array($indice,$bloqueia)){
       $final = $array[$indice];

Assim vai mostrar um só. É que na verdade eu não entendi bem o objetivo disso, por isso não sei como te dar o resultado final mais adequado, rs

 

Eu consegui entender o que você quer, que é randomizar os elementos da array sem que eles se repitam, mas o objetivo e tal, como mostrar o resultado eu não entendi bem não :P

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.