2011-01-07 3 views
2

Mögliche Duplizieren:
Generating random results by weight in PHP?Zufalls gewichtete Auswahl eines Ereignisses

ich eine Datenbank vorgenommen haben, in dem ich den Namen speichern und die Verbindung von rss feeds.i gemacht haben das rss Leser und alles ist bis jetzt ok.Ich möchte einen News-Scroller machen, der die Artikel der Feeds zeigt. Aber ich möchte den Feeds einige Gewichtswerte geben, damit jeder Feed entsprechend seiner Wichtigkeit für mich automatisch ausgewählt wird wenn ein Feed aus den in der Datenbank enthaltenen Artikeln ausgewählt wird o nly wird im Scroller gezeigt werden. Irgendwelche Ideen, wie ich das tun kann ??? Vielen Dank im Voraus.

p.s. Mein Problem ist, wie kann ich aytomatisch die zufällige gewichtete Wahl der Feeds aus der Datenbank und nicht, wie man die Artikel der Feeds zeigen (ich habe diesen Teil getan).

Antwort

6

Zwei Wege, dies zu tun, dass ich von der Oberseite meines Kopfes denken kann:

Option 1: ein neues Array mit den Schlüsselwerten aus der Menge der Daten, geben Sie bitte, wo das Gewicht, wie oft ein bestimmt Gegenstand wird wiederholt. Der Anteil in diesem Array stimmt dann mit der gewichteten Verteilung überein. Einfach mit $arr[array_rand($arr)] greifen. Während einfach und leicht zu verstehen, wird dies in Ihrem Gesicht explodieren, wenn es eine Menge von Gegenständen gibt, oder wenn die Gewichtswerte wirklich hoch sind.

Option 2. Summe der Gewichte. Wählen Sie eine Zufallszahl zwischen 0 und der Summe der Gewichte. Überstreichen Sie die Elemente im Datensatz, vergleichen Sie sie mit der Zufallszahl, die Sie ausgewählt haben. Sobald Sie einen Wert erreichen, der gleich oder größer als der Zufallsindex ist, wählen Sie dieses Element aus.

function findRandomWeighted(array $input) { 
    $weight = 0; 
    // I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter. 
    foreach($items as $item) { 
     $weight += $item['weight']; 
    } 

    $index = rand(1, $weight); 
    foreach($items as $item) { 
     $index -= $item['weight']; 
     if($index <= 0) { return $item['value'] } 
    } 

    return null; 
} 

Nach unserem Gespräch in den Kommentaren unten, hier ist ein Pastebin mit dem Code in es:

http://pastebin.com/bLbhThhj

+0

+1 Die zweite Option wäre wahrscheinlich schneller und möglicherweise einfacher zu implementieren. – ughoavgfhw

+0

Nein, die Datenbank wird nicht viele Einträge haben.10 Feeds am meisten ... Die Datenbank hat nur 3 Felder.Id, Name des Feeds, URL des Feeds. Um ehrlich zu sein, verstehe ich nicht die erste Lösung, die Sie gab mir so viel. Ich werde versuchen, die zweite als eine erste Annäherung .. Ich bin nicht Profi in PHP und es sieht einfacher für mich aus .. Danke! – olaf36

+0

Hallo user566487 - was das erste Beispiel tut: Wenn Sie ein Array wie dieses haben $ Feeds = Array (Array ('Wert' => 'Feed 1', 'Gewicht' => 2), Array ('Wert' => 'Feed 2', 'Gewicht' => 1), Array ('Wert' => 'Feed 3', 'Gewicht' => 5)) ', es erzeugt ein sekundäres Array wie:' array ('Feed 1', 'Feed 1', 'Feed 2', 'Feed 3', 'Feed 3', 'Feed 3', 'Feed 3', 'Feed 3'); 'Jedes Element wird so oft eingefügt, wie sein Gewicht angibt. Dann können Sie einfach eine zufällige herausziehen, mit array_rand(), und es wird zufällig nach den Gewichten, die Sie angegeben haben. Aber wenn Sie denken, dass die zweite einfacher ist, benutzen Sie bitte diese, da es besser ist :) – kander

0

Sie schnellen Algorithmus implementiert und beschrieben finden können - weighted random (in Javascript kann aber sein, in wenigen Minuten nach PHP umgeschrieben). Es ist viel schneller als Schleife durch das Array.

+0

Sie sollten nicht einfach einen Link zu einer anderen Website als Antwort geben, da die Website in Zukunft möglicherweise veraltet sein wird. Klicken Sie stattdessen auf den Link "Bearbeiten" in dieser Antwort und fügen Sie hier die wesentlichen Teile der Lösung von dieser Seite ein. Siehe: http://meta.stackexchange.com/q/8259 –