2009-08-07 4 views
9

So come selezionare un articolo casuale da un array, ma che ne dici di dieci elementi a caso da un array di, diciamo, venti elementi? (In PHP.)Come seleziono 10 cose casuali da un elenco in PHP?

Ciò che rende un po 'più complicato è che ogni elemento ha effettivamente due parti: un nome file e una descrizione. Fondamentalmente, è per una pagina web che visualizzerà dieci immagini casuali ogni volta che si ricarica. Il formato effettivo di questi dati non ha molta importanza, anche se è abbastanza semplice che preferirei contenerlo in testo piatto o addirittura in codice, piuttosto che impostare un database. (Non è destinato anche a cambiare spesso.)

Domanda bonus, non sono sicuro se ho intenzione di farlo ancora adesso - ma come pondererai le voci, in modo tale che determinati elementi sempre vengono prelevati, o a meno frequentemente di altri?

Grazie.

risposta

16

Come selezionare uno o più oggetti casuali da una matrice in PHP: http://us3.php.net/manual/en/function.array-rand.php

Come fare casuali elementi ponderati:
http://20bits.com/articles/random-weighted-elements-in-php/

+0

Non sapevo che array_rand potesse selezionare più di una voce da un array, ma per me ha funzionato alla grande. – saikofish

+0

array_rand ti porta purtroppo un array di valori, non chiavi.Ciò significa che entrambi fanno un sacco di valori falsi (se il set statico e le prestazioni sono re): {'shoes' => 1, 'abbigliamento' => 1, 'foo' => 1) o usa un array_flip interno (a condizione che il tuo valori-poi-chiavi sono unici). –

+0

20bits-link è rotto, tuttavia c'è [stackoverflow.com/questions/4726281](http://stackoverflow.com/questions/4726281) –

0
<?php 
$inarray = range(0,100); 
shuffle($inarray); 
$outarray = array_slice($inarray, 0, 20); 
?> 
21

Si potrebbe shuffle l'array e poi scegliere il primo dieci elementi con array_slice:

shuffle($array); 
$tenRandomElements = array_slice($array, 0, 10); 
0

Un array di matrici in PHP dovrebbe essere una buona strategia. È possibile mantenere i dati per questi array in qualsiasi modo tu voglia (hard-coded, XML, ecc) e disporlo nelle matrici in quanto tali:

Array { 
    Array (item0) { filename,description, weight,...} 
    Array (item1) { filename,description, weight,...} 
    Array (item2) { filename,description, weight,...} 
} 

è possibile utilizzare la funzione array_rand per rimuovere in modo casuale gli elementi da l'array. Creare un valore di peso per ogni voce ti permetterà di scegliere una voce rispetto ad un'altra usando una sorta di strategia prioritaria (ad esempio, prendere casualmente 2 elementi dall'array, controllare il peso, scegliere quello con un peso maggiore e sostituire l'altro)

3

esempio # 1 array_rand() esempio

<?php 
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); 
$rand_keys = array_rand($input, 2); 
echo $input[$rand_keys[0]] . "\n"; 
echo $input[$rand_keys[1]] . "\n"; 
?> 
0

domanda bonus risposta: Date un'occhiata a Roulette Wheel selection. Il sito web parla di algoritmi geologici, ma i metodi di selezione sono validi e possono essere applicati a una serie di idee.

0

Ho un po 'di codice che fa esattamente quello che chiedi. Conservo un elenco di link di sponsorizzazione in un file di testo e li seleziono a caso. Ma, se voglio inclinare il set, ho utilizzare più il file link ;-)

Sponsor:

<a href="http://www.example.com">Example</a> 
<a href="http://www.example.com">Example</a> 
<a href="http://www.bbc.co.uk">BBC</a> 
<a href="http://www.google.com">Google</a> 

PHP:

$sponsor_config = 'sponsors.txt'; 
$trimmed = file($sponsor_config, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$op = array(); 

$limit = 20; // insurance 
$loops = 0; 
$needed = 4; 
$op[] = '<div id="sponsorship"><!-- start sponsorship -->'; 
$selected = array(); 
while ((count($selected) < $needed) AND ($loops <= $limit)) { 
    $choice = rand(0, count($sponsors)-1); 
    if(!in_array($sponsors[$choice], $selected)) $selected[] = $sponsors[$choice]; 
    $loops++; 
} 

foreach($selected as $k => $selection) { 
    $op[] = '<p class="sponsorship bg_'.($k%3+1).'">Click the link below to<br />visit our Site Sponsor:<br />'.$selection.'</p>'; 
} 

$op[] = '</div><!-- end sponsorship -->'; 
return join("\n",$op)."\n"; 

V. rapido e v.v. sporco ... ma funziona

+0

Grazie per tutto l'aiuto di tutti. Ho deciso, per ora, che piuttosto che usare uno schema di ponderazione, quelli che voglio apparire tutto il tempo non saranno semplicemente inseriti nella matrice, e quelli che appariranno casualmente saranno scelti dall'array. – saikofish