2009-11-10 3 views
2

J'ai un système PHP en ligne où les utilisateurs votent différents prix pour leurs amis, mais je trouve que les prix au milieu de la page et au fond obtiennent moins de votes dans l'ensemble . Je préférerais que ce soit uniformément distribué donc est venu avec la commande de la liste des prix par hasard pour le rendre différent chaque fois que vous chargez la page. Cela semble toutefois perturber les utilisateurs car alors ils enregistrent ou revisitent la page tout se déplace, est-il possible que je puisse commander la liste aléatoirement mais enregistrer cet ordre pour cet utilisateur, ce qui signifie qu'il est différent pour chaque utilisateur.Le moyen le plus efficace pour commander une liste par un aléatoire

La liste des votes provient d'une base de données et les noms des prix sont prédéfinis.

Connaissez-vous un moyen de le faire?

En fin de compte, j'utilisé:

//Shuffle & Organise 
    if(is_numeric($pg)) { $start = ($pg*15)-14; $end = $pg*15; $pg = (int) $pg; } else { $start = 1; $end = 15; $pg = (int) 1; } 
    if($end>count($vote_name)) { $end = count($vote_name); } 
    $vote_boxes = range($start,$end); 
    srand($user['id']); 
    shuffle($vote_boxes); 

    //Create the voting boxes + js 
    foreach($vote_boxes as $row) { 
     $content .= vote_form($row); 
    } 

Répondre

2

La façon la plus efficace est sans doute de créer un ordre de tableau complètement aléatoire et cache pour chaque utilisateur. Excepté le postet de la solution MySQL ci-dessus, vous pouvez utiliser php dans un style très similaire: Vous pouvez utiliser l'identifiant de session comme un début pour le générateur de nombres aléatoires et de mélanger le tableau en utilisant ce nombre "aléatoire". En faisant cela, chaque utilisateur reçoit une liste triée différemment, chaque fois qu'il demande votre site (au moins aussi longtemps que la session n'expire pas).

<?php 

    $array = array("Cat", "Dog", "Mouse"); 

    session_start(); 
    $session_id_int = (int)session_id(); 
    srand($session_id_int); 

    echo '<pre>BEFORE:'.PHP_EOL; 
    print_r($array); 

    shuffle($array); 

    echo 'AFTER:'.PHP_EOL; 
    print_r($array); 
+0

J'ai utilisé une solution basée sur les informations que vous avez postées en combinaison avec la solution MySQL ci-dessus. Je vais le poster ici quand c'est fini. –

2

Si la table de base de données n'est pas très grand (car cela va fondre votre base de données si vous parlez plus de quelques lignes).

<?PHP 
$ip = $_SERVER['REMOTE_ADDR']; 
$sql = "SELECT * FROM table ORDER BY md5(CONCAT(id,'$ip');"; 
$result = db_query($sql); 
?> 

Cela va hacher la colonne id (choisir n'importe quelle colonne, vraiment) de l'enregistrement et l'adresse IP du client. Chaque adresse IP qui visite le site obtiendra une commande différente, mais elle restera statique aussi longtemps que son adresse IP.

0

Pour utiliser le brassage réel, utilisez l'algorithme de lecture aléatoire de Fisher-Yates. utiliser quelque chose d'unique à chaque utilisateur pour graver le prng avant le shuffle.

4

Je suppose que vos utilisateurs ont Identifiants uniques dans la table des utilisateurs, alors pourquoi ne pas simplement

select * from awards order by rand($user_id) 

rand() peut accepter un argument qui signifie « graine »

+0

Je ne savais pas accepté une graine, toujours demandé pourquoi il avait() est Très utile mais pas exactement ce que je cherche cette fois-ci. –

+2

Ceci est exactement ce que vous cherchiez. – ntd

Questions connexes