Jump to content
Sign in to follow this  
Nordi

array_rand() Problema com 0.

Recommended Posts

Nordi

Tenho uma consulta à db que se baseia num rand de uma array. Funcionava bem até que me mostra um resultado em branco.

Fiz o debug e parece tudo correcto, dei então echo ao array_rand que estava a ser gerado e fui gerando até ele me mostrar novamente em branco. E passadas algumas tentativas :

ID CARRO: 0 (A minha dúvida é porque gera ele um 0 se não tenho esse valor na array  🤔 )

Aqui fica o código que está a gerar os números possíveis para seleccionar na db:

$numeros = array("5","8","9","10","11","12","13","14,","15","16","17","18","19","20","23");
$idcarro=array_rand($numeros);

Share this post


Link to post
Share on other sites
pmg

Para quê as aspas? Se são números ...

$numeros = array(5, 8, 9, ...);

Um dos elementos do array é "14," (virgula incluida no elemento). Possivelmente é este que dá zero.

Vê a resposta do fil79: os arrays, em PHP, começam no indice 0.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
fil79

O problema está no facto de o teu código estar apenas a devolver o indice do array (que começa em zero):

Solução:

$input = array("1", "2", "3", "4", "5");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";


MCITP-MCTS-MCP

Share this post


Link to post
Share on other sites
Nordi

yoda eu quero o contrário, quero que ele me seleccione mediante o perfil do utilizador uma variável à sorte das possíveis para esse perfil de utilizador.

Se é que me faço entender, ou seja algo deste género:

SELECT o_que_quero FROM tabela WHERE id='".$input[$rand_keys[0]]."'

Share this post


Link to post
Share on other sites
mjamado

ORDER BY RAND(5,8,9,10,11,12,13,14,15,16,17,18,19,20,23)

Algo assim yoda ?  🤔

Não, seria;

SELECT os_campos
FROM tabela
WHERE id IN($ids_em_forma_de_string_já_te_mostro_abaixo)
ORDER BY RAND()

Para converter um array numa string separada por vírgulas, fazes implode(",", $o_array);

No entanto, para este caso em concreto, mais vale mesmo retirar logo o id que queres directamente do array para a query.

A solução do fil79 está correcta, embora eu talvez preferisse usar o shuffle.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Nordi

yoda porque um rand normal poderia sair ids que não são possiveis.

rand(5,23) poderia sair um 21 e este não é possivel.

Sim eu adoptei a solução do fil79 mjamado e cumpre o que pretendo sem grandes problemas.

Só estava a tentar perceber a outra solução que o yoda deu.

Share this post


Link to post
Share on other sites
Nordi

yoda sai o 21 por exemplo dessa maneira  :P

É que o 21 existe na tabela. Só não quero que saia porque não se adapta a esse perfil de utilizador.

Posso estar a baralhar tudo, mas corrige-me se estiver enganado.

<?
//Verifica se o utilizador é fem ou masc por exemplo
//Mediante o resultado as diferentes acções
if ($sex == $masc) {
//Escolher um id entre :  5,8,9,10,11,12,13,14,15,16,17,18,19,20,23
} else {
//Escolher um id entre :  1,2,3,4,6,7,21,22,24,25,26,27
}
?>

Share this post


Link to post
Share on other sites
KTachyon

O rand() no SQL funciona, mas não deve ser utilizado. Podes ir buscar o número de linhas da tabela:

SELECT COUNT(*) FROM tabela;

E gerar um número aleatório ($n) entre 1 e N, para depois fazer:

SELECT * FROM tabela LIMIT $n, 1;

Desta forma vais buscar um registo aleatório à tabela.

No teu caso:

SELECT COUNT(*) FROM tabela WHERE sex='M';

Geras um valor entre 1 e o count e:

SELECT * FROM tabela WHERE sec='M' LIMIT $n, 1;


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Nordi

KTachyon obrigado pela tentativa, mas não resulta assim. Eu é que não devo ter explicado bem.

Na query eu não tenho como definir as condições de pesquisa como o yoda disse.

SELECT * FROM tabela WHERE sex='M' LIMIT $n, 1;

Na tabela que eu quero que o rand actue não tem a informação do sex, logo o WHERE não serve para nada.

Dai ter colocado o if porque aquelas variáveis vem de trás

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.