Два начина да направя това, за които се сещам от върха на главата си:
Вариант 1:Попълнете нов масив с ключовите стойности от набора данни, където теглото определя колко често се повтаря даден елемент. След това пропорцията в този масив съответства на претегленото разпределение. Просто вземете с помощта на $arr[array_rand($arr)]
. Макар че е просто и лесно за разбиране, това ще избухне в лицето ви, ако има МНОГО артикули или ако стойностите на теглото са наистина високи.
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
Вариант 2. Сумирайте теглата. Изберете произволно число между 0 и сумата на теглата. Прегледайте елементите в набора от данни, сравнете с произволното число, което сте избрали. Веднага щом ударите такъв, който е равен или по-голям от произволния индекс, изберете този елемент.
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;
}
След нашия разговор в коментарите по-долу, ето Pastebin с кода в него: