To måder at gøre dette på, som jeg kan tænke på fra toppen af mit hoved:
Mulighed 1:Udfyld et nyt array med nøgleværdierne fra datasættet, hvor vægten bestemmer, hvor ofte et emne gentages. Andelen i dette array matcher derefter den vægtede fordeling. Bare tag fat med $arr[array_rand($arr)]
. Selvom det er enkelt og let at forstå, vil dette eksplodere i dit ansigt, hvis der er MANGE genstande, eller hvis vægtværdierne er virkelig høje.
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
Mulighed 2. Sum vægtene. Vælg et tilfældigt tal mellem 0 og sum-of-weights. Sløjfe over elementerne i datasættet, sammenlign med det tilfældige tal, du valgte. Så snart du rammer en, der er lig med eller større end det tilfældige indeks, skal du vælge det element.
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 vores samtale i kommentarerne nedenfor, er her en Pastebin med koden i: