Я работаю с двумя вращающимися ссылками в редиректоре php, есть ли способ взвешивать их в процентах?
Например: первая ссылка будет иметь шанс 70% или будет перенаправлена, а вторая 30%.
Код:
<?php
$k = $_GET['sub'];
$aff[] = 'http://google.com';
$aff[] = 'http://yahoo.com';
srand ((double) microtime() * 1000000);
$random_number = rand(0,count($aff)-1);
$lol = ($aff[$random_number]);
$lal = $lol.$k;
header("Location: $lal");
?>
Заметка: Есть похожие вопросы, но они включают более двух переменных.
Это похоже на работу.
$array = array(70 => "http://google.com",
30 => "http://yahoo.com");
$random_number = rand(0, 100);
$last_interval = 0;
$link = "";
foreach( $array as $key => $value ) {
// in range?
if($random_number > $last_interval && $random_number < $key + $last_interval) {
$link = $value;
break;
}
$last_interval = $key;
}
echo "You chose: " . $link;
Концепция была взята из https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight и немного адаптирован вот концепция, которая будет работать. Благодарим Бенджамина Клостера, который сделал оригинальное сообщение.
Подготовьте список интервалов от 0 до суммы (веса, 30 и 70 в вашем случае). Каждый интервал представляет одну ссылку, его длина является весом, поэтому для вашего примера:
intervals = [70, 100]
Где индекс 0-70 представляет ссылку № 1, 70-100 ссылка № 2.
Может быть, вы можете сделать это так:
$array = array(
array( 30, 'http://google.de/' ),
array( 70, 'http://google.com/' )
);$number = rand( 1, array_sum( array_column( $array, 0 ) ) );
$lastsum = 0;
foreach( $array as $arr ){
if( $number > $lastsum && $number <= ( $lastsum + $arr[0] ) ){
$url = $arr[1];
break;
}
$lastsum += $arr[0];
}