我正在使用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");
?>
有类似的问题,但涉及两个以上的变量。
答案 0 :(得分:1)
这似乎有效。
$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并略微适应,这是一个可行的概念。感谢@Benjamin Kloster撰写了原帖。
准备一个包含0到总和的间隔列表(在您的情况下为权重,30和70)。每个间隔代表一个链接,其长度是它的重量,因此对于您的示例:
intervals = [70, 100]
其中索引0-70表示链接#1,70-100表示链接#2。
答案 1 :(得分:0)
也许你可以这样做:
$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];
}