2013-01-17 13 views
5

Sto eseguendo un sito Web di creazione di quiz. Desidero mostrare le risposte a una domanda a un utente in un ordine mescolato.Shuffling Array allo stesso modo, in base al numero

sto cercando di evitare di memorizzare l'ordine in cui le risposte sono state presentate per l'utente, se dovessi mischiare loro in modo casuale.

Voglio mescolare le risposte in modo prevedibile, in modo da poter ripetere lo shuffle allo stesso modo in seguito (quando si visualizzano i risultati).

Ho pensato di poter mescolare l'elenco di risposte di un certo numero (utilizzando il numero nell'ordine o più tipi di ordinamento identificabili tramite un numero ID. In questo modo posso semplicemente memorizzare il numero che sono stati mescolati e richiamati di nuovo al numero per rimescolarli nello stesso ordine

Ecco lo scheletro di quello che ho finora, ma non ho alcuna logica per rimettere le risposte in $ shuffled_array nell'ordine mescolato

<?php 

function SortQuestions($answers, $sort_id) 
{ 
    // Blank array for newly shuffled answer order 
    $shuffled_answers = array(); 

    // Get the number of answers to sort 
    $answer_count = count($questions); 

    // Loop through each answer and put them into the array by the $sort_id 
    foreach ($answers AS $answer_id => $answer) 
    { 
     // Logic here for sorting answers, by the $sort_id 

     // Putting the result in to $shuffled_answers 
    } 

    // Return the shuffled answers 
    return $shuffled_answers; 
} 


// Define an array of answers and their ID numbers as the key 
$answers = array("1" => "A1", "2" => "A2", "3" => "A3", "4" => "A4", "5" => "A5"); 

// Do the sort by the number 5 
SortQuestions($answers, 5); 

?> 

C'è tecnica che io ca n usare per mescolare le risposte con il numero passato nella funzione?

+0

Considerare "l'archiviazione" l'ordine di risposta all'interno di un elemento di input nascosto? :) –

risposta

3

La funzione PHP shuffle utilizza il seme casuale assegnato con srand, quindi è possibile impostare un seme casuale specifico per questo.

Inoltre, la modifica metodo di riordino è le chiavi dell'array, ma questo non è probabilmente il miglior risultato per voi, quindi si può utilizzare una diversa funzione shuffle:

function shuffle_assoc(&$array, $random_seed) { 
    srand($random_seed); 

    $keys = array_keys($array); 

    shuffle($keys); 

    foreach($keys as $key) { 
     $new[$key] = $array[$key]; 
    } 

    $array = $new; 

    return true; 
} 

Questa funzione non mancherà di tenere le chiavi originali, ma con un ordine diverso.

+0

Sfortunatamente 'srand' funziona solo una volta per processo PHP. Se chiami questa funzione due volte con lo stesso seme otterrai risultati diversi (anche se otterrai sempre * gli stessi * risultati diversi ogni volta). – Jon

+0

@mistermartin: intendevo che il successivo 'srand' chiama dopo che il primo non avrebbe avuto alcun effetto per la durata del processo PHP. Purtroppo non posso riprodurre questo oggi e non ho fornito alcun riferimento sopra, quindi sembra impreciso. Cancellerò entrambi questi commenti domani. – Jon

0

Questo può essere uno dei possibili modi.

$result = SortQuestions($answers, 30); 
print_r($result); 


function SortQuestions($answers, $num) 
{ 
$answers = range(1, $num); 
shuffle($answers); 
return $answers; 
} 
2

È possibile ruotare l'array di un fattore.

$factor = 5; 
$numbers = array(1,2,3,4); 
for ($i = 0; $i < $factor; $i++) { 
    array_push($numbers, array_shift($numbers)); 
} 
print_r($numbers); 

Il fattore può essere randomizzati, e una funzione può passare la matrice al suo posto, per rotazione viceversa.

+0

Grazie per la risposta. Definisci il '$ factor' e non utilizzarlo nel codice:/ – Luke

+0

Sì, naturalmente, lascia che lo modifichi! :) – Kao

+0

Funziona bene, ma vorrei solo che ci fosse un modo per renderlo un po 'più casuale? Qualche idea? :) – Luke

Problemi correlati