Två sätt att göra detta, som jag kan tänka på från toppen av mitt huvud:
Alternativ 1:Fyll en ny array med nyckelvärdena från datauppsättningen, där vikten avgör hur ofta ett objekt upprepas. Andelen i denna array matchar sedan den viktade fördelningen. Ta bara tag med $arr[array_rand($arr)]
. Även om det är enkelt och lätt att förstå, kommer detta att explodera i ditt ansikte om det finns MÅNGA föremål eller om viktvärdena är riktigt höga.
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
Alternativ 2. Summa vikterna. Välj ett slumpmässigt tal mellan 0 och summa-of-weights. Slinga över elementen i datamängden, jämför med det slumptal du valde. Så snart du träffar en som är lika med eller större än det slumpmässiga indexet, välj det elementet.
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;
}
Efter vår konversation i kommentarerna nedan, här är en Pastebin med koden i den: