Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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];Complicou demais, kkkkkkkkkk
Meu conhecimento em php é baixo, e é isso mesmo a requisição é cadas vez que atualiza a página. mas eu ão uso banco nesse sistema apenas curl, veja:
Mas parece interessante a sua solução da variável, mas eu teria conhecimento para isso.
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.
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.
Aqui funcionou. Certifique-se de que seu navegador não está bloqueando os cookies ou tente em outro navegador.
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;
?>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.
Boa adicionei.
echo "<br> Alguma Coisa";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>';
}Modifiquei, e testando...
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";
?>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;
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";
?>Qual a logica de se fazer isso ?
Porque usar cookie ?
Para usar todos as palavras do array sem repetir, e quando terminar reiniciar novamente o array.
>
Qual a logica de se fazer isso ?
Porque usar cookie ?
Se você tem uma ideia melhor, compartilhe.
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..
Boa noite, e obrigado por tentar, coloquei o seu código veja:
http://tectonny.com/musica/termo.php
Apareceu 11 termos de uma só vez.
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
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.
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"]);$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.
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
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"]);$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();Editei e deu erro na linha 18
Acabei de perceber que faltou uma ) pra fechar o if na linha 18, é só consertar deixando assim:
/linha 18 / if(!in_array($indice,$bloqueia)){
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?