Aenoa Posté 21 Juillet 2011 Posté 21 Juillet 2011 (modifié) Bonjour / bonsoir, je cherche actuellement à sélectionner, dans une tranche donnée (lignes 0 à 3000 par exemple), des chiffres qui ne seraient pas dupliqués. j'ai, après de nombreuses tentatives, réussi à créer ce script: $total = 3000;$question_id = array(); for($i = 1; $i <= 30; $i++) { $t = 0; $value = rand(0, $total); foreach($question_id as $a) { if($value == $a) { $t =1; } } if($t == 0) { $question_id[$i] = $value; } while($t == 1) { $value = rand(0, $total); foreach($question_id as $a) { if($value == $a) { $t =1; } } if($t == 0) { $question_id[$i] = $value; } } } Ma question est la suivante : Est-ce que ce script est potable, bien construit ? Est-ce qu'à un moment ou un autre, le script pourrais poser problème, sachant qu'il me faut impérativement 30 résultats ? Merci cordialement, Aenoa EDIT : j'ai intégralement reformulé la question et le sujet, afin d'éviter d'encombrer le message de trop de code. Modifié 21 Juillet 2011 par Aenoa
Leonick Posté 21 Juillet 2011 Posté 21 Juillet 2011 en utilisant in_array() ça serait bien plus propre et plus rapide comme code
SStephane Posté 22 Juillet 2011 Posté 22 Juillet 2011 array_rand() & file() (pour lire les 'lignes' qui j'imagine sont dans un fichier) et ton script est réduit à 3 lignes de code, j'aurai tendance à penser que ton script est un peu compliqué
MarvinLeRouge Posté 22 Juillet 2011 Posté 22 Juillet 2011 Salut, Alors, comme ça, à l'arrache : un tableau contenant dans chaque case la valeur de l'index (oui c'est voulu) tu choisis un index au hasard avec array_rand tu la notes (genre dans un autre tableau) tu supprimes la case en question du tableau Et hop tu as un tirage d'index, sans remise.
Aenoa Posté 22 Juillet 2011 Auteur Posté 22 Juillet 2011 en fait, le "in_array" me sera bien utile, mais dans mon cas, le "array_rand" et le "list" n'ont pas lieu d'être. dans mon cas, je dispose d'une énorme base de donnée, et je calcule le nombre de lignes. ensuite, j'effectue un rand() entre 0 et le nombre de lignes - 1. je récupère l'ID de la ligne, et je la met dans mon tableau ($question_id). une fois les 30 chiffres obtenus, j'effectue un SELECT sur la table, avec un WHERE id='x'. je met chaque paramètre dans une variable, dépendante pour chaque question ($question['n°-question']['colonne']). ça fonctionne parfaitement, merci à tous de votre aide, je garde en mémoire les fonctions citées, elles me seront utiles pour plus tard cordialement, aenoa
SStephane Posté 22 Juillet 2011 Posté 22 Juillet 2011 Je comprends pas grand chose, mais on dispose pas vraiment des éléments (ligne = tuple) Dans le cas d'une base de données, pourquoi ne sélectionne tu pas au hasard dans ta base ? (order by rand() limit 0,30)
Dadou Posté 22 Juillet 2011 Posté 22 Juillet 2011 C'est la solution que j'allais proposer, c'est franchement la plus propre à mettre en place SELECT * FROM question ORDER BY RAND() LIMIT 0, 30
Aenoa Posté 22 Juillet 2011 Auteur Posté 22 Juillet 2011 oui, mais je ne connaissais pas cette fonction SQL. j'ai évidement énormément encore à apprendre, et c'est en posant des questions ici que je compte m'améliorer merci à tous
Leonick Posté 22 Juillet 2011 Posté 22 Juillet 2011 vu ce que tu souhaites faire, le rand() en sql c'est le plus adapté
MarvinLeRouge Posté 25 Juillet 2011 Posté 25 Juillet 2011 Salut, Le ORDER BY RAND() est mauvais niveau performance, surtout sur de grosses tables, il existe des alternatives. Sinon, au lieu de faire une requète par id, fais-en une seule avec un "WHERE id IN (" . implode(",", tabIndexes) . ")"
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant