2009-08-07 4 views
9

Ich weiß, wie man einen zufälligen Artikel aus einem Array auswählen, aber wie wäre es mit zehn zufällige Artikel aus einer Reihe von, sagen wir, zwanzig Artikel? (In PHP.)Wie wähle ich 10 zufällige Dinge aus einer Liste in PHP?

Was es ein wenig komplizierter macht ist, dass jedes Element tatsächlich zwei Teile hat: ein Dateiname und eine Beschreibung. Im Grunde genommen handelt es sich um eine Webseite, die bei jedem Nachladen zehn zufällige Bilder anzeigt. Das tatsächliche Format dieser Daten ist nicht wirklich wichtig, obwohl es einfach genug ist, dass ich es lieber in Flat-Text oder sogar in hartem Code enthalte, anstatt eine Datenbank einzurichten. (Es ist auch gemeint, nicht oft zu ändern.)

Bonus Frage, nicht sicher, ob ich werde dies tun, nur noch - aber wie würden Sie die Einträge gewichten, so dass bestimmte Artikel immer abgeholt bekommen, oder bei am wenigsten häufiger als andere?

Danke.

Antwort

16

Wie aus einem Array in PHP ein oder mehr zufälligen Elemente auszuwählen: http://us3.php.net/manual/en/function.array-rand.php

Wie zufällig gewichteten Elemente tun:
http://20bits.com/articles/random-weighted-elements-in-php/

+0

Ich wusste nicht Array_Rand konnte mehr als einen Eintrag aus einem Array auswählen, aber das hat gut für mich funktioniert. – saikofish

+0

array_rand liefert Ihnen leider eine Reihe von Werten, keine Schlüssel.Das bedeutet, dass Sie entweder eine Menge falscher Werte tun (wenn die statische Menge und die Leistung groß sind): {'Schuhe' => 1, 'Kleidung' => 1, 'foo' => 1) oder benutzen Sie einen inneren array_flip (vorausgesetzt, Ihr values-then-keys sind einmalig. –

+0

20Bits-Link ist gebrochen, aber es gibt [stackoverflow.com/questions/4726281](http://Stackoverflow.com/questions/4726281] –

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

Sie das Array shuffle könnten und dann die ersten Pick zehn Elemente mit array_slice:

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

Ein Array von Arrays in PHP sollte eine gute Strategie sein. Sie können in irgendeiner Weise die Daten für diese Anordnung halten Sie (hartcodiert, XML, etc.) und ordnen sie in den Anordnungen als solche:

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

Sie können dann die array_rand Funktion verwenden, um zufällig Elemente zu entfernen das Array. Wenn Sie einen Gewichtswert für jeden Eintrag erstellen, können Sie einen Eintrag anhand einer Prioritätsstrategie auswählen (z. B. zwei Elemente aus dem Array zufällig zuführen, Gewicht prüfen, das größere auswählen und das andere ersetzen).

3

Beispiel # 1 array_rand() Beispiel

<?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

Bonus Frage Antwort: Werfen Sie einen Blick auf Roulette Wheel selection. Die Website spricht über geentische Algorithmen, aber die Auswahlmethoden sind fundiert und können auf eine Reihe von Ideen angewendet werden.

0

Ich habe etwas Code, der tut, was Sie verlangen. Ich speichere eine Liste von Sponsorenlinks in einer Textdatei und wähle sie zufällig aus. Aber wenn ich den Satz verdrehen will, muß ich die

;-) Links mehr verwende

Sponsoren Datei:

<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. schnell und V.V. schmutzig ... aber es funktioniert

+0

Vielen Dank für die Hilfe für alle. Ich habe vorerst entschieden, dass anstatt eines Gewichtungsschemas diejenigen, die ich immer erscheinen möchte, nicht in das Array eingegeben werden, und diejenigen, die zufällig erscheinen, werden aus dem Array ausgewählt. – saikofish

Verwandte Themen