如何选择与特定百分比概率相关的PHP变量?

如何选择与特定百分比概率相关的PHP变量?,php,variables,random,foreach,Php,Variables,Random,Foreach,我正努力想知道我在做什么,但有点困难。。。任何帮助或指导都将不胜感激 因此,我在一个表中提取了一些值,这些值是根据我预定义的数组(漂亮地命名为$array)提取的。我就是这样做的: foreach ($array as $value) { $query = "SELECT * FROM b_table WHERE levelname='$value'"; $result = runquery($query); $num = mysql_numrows($result); $i=0; whil

我正努力想知道我在做什么,但有点困难。。。任何帮助或指导都将不胜感激

因此,我在一个表中提取了一些值,这些值是根据我预定义的数组(漂亮地命名为$array)提取的。我就是这样做的:

foreach ($array as $value) {

$query = "SELECT * FROM b_table WHERE levelname='$value'";
$result = runquery($query);
$num = mysql_numrows($result);

$i=0;
while ($i < 1) {
$evochance=@mysql_result($result,$i,"evochance");  // These values are integers that will add up to 100. So in one example, $evochance would be 60, 15 and 25 if there were 3 values for the 3 $value that were returned.
$i++;
}
foreach($array作为$value){
$query=“从b_表中选择*,其中levelname='$value';
$result=runquery($query);
$num=mysql\u numrows($result);
$i=0;
而($i<1){
$evochance=@mysql_result($result,$i,“evochance”);//这些值是加起来等于100的整数。因此,在一个示例中,如果返回的3$值有3个值,$evochance将分别为60、15和25。
$i++;
}
现在我不知道该怎么办了。$evochance表示与每个$value关联的百分比机会。 假设通过某个函数选择了有利的60%,那么它将把与之链接的$value插入到另一个表中

我知道这没用,但我想到的最多的是:

if (mt_rand(1,100)<$evochance) {
$valid = "True";
} 
else {
$valid = "False";
}
echo "$value chance: $evochance ($valid)<br />\n"; // Added just to see the output.
if(百万兰特(1100)

如果我理解正确,您希望从数组中选择一个项目,每个项目都有一定的被选择概率。此方法可以做到这一点。确保概率总和为100。

我想我理解您的要求。如果我理解正确,“百分比概率”是应选择记录的频率。为了确定这一点,您必须通过每次使用记录时增加一个值来跟踪何时选择记录。您所做的操作没有“随机性”,因此mt_rand()或rand()函数不符合顺序

如果我理解正确,以下是我的建议。我将简化代码以提高可读性:

<?php

$value = 'one';   // this can be turned into an array and looped through
$query1 = "SELECT sum(times_chosen) FROM `b_table` WHERE `levelname` = '$value'";
$count =  /* result from $query1 */
$count = $count + 1; // increment the value for this selection

// get the list of items by order of percentage chance highest to lowest
$query2 = "SELECT id, percentage_chance, times_chosen, name FROM `b_table` WHERE `levelname` = '$value' ORDER BY percentage_chance DESC";
$records = /* results from query 2 */
// percentage_chance INT (.01 to 1) 10% to 100%
foreach($records as $row) {
    if(ceil($row['percentage_chance'] * $count) > $row['times_chosen']) {
        // chose this record to use and increment times_chosen
        $selected_record = $row['name'];
        $update_query = "UPDATE `b_table` SET times_chosen = times_chosen + 1 WHERE id = $row['id']";
        /* run query against DB */
        // exit foreach (stop processing records because the selection is made)
        break 1;
    }
}

// check here to make sure a record was selected, if not, then take record 1 and use it but
// don't forget to increment times_chosen

?>

67%的时间会选择记录1,21%的时间会选择记录2,12%的时间会选择记录3。

您希望实现的实际最终结果是什么?即,对所有这些代码应该实现的功能进行高级描述。如果只是数字杂耍,您可能可以通过一个查询在数据库中完成相同的操作。首先更改:将您的输入转义到MySQL!@Deal我可以看到很多建议的更改:)运行此操作时,我希望它使用levelname值更新单独表中的一个字段,该值对应于输出为true的百分比…如果有意义的话。@Delan:使用MySQL\u escape\u string()医生:谢谢你,这帮了我很多忙。它或多或少是按照我的意愿工作的——你是个明星!很高兴能帮上忙!我花了一点功夫才明白,但我想我终于做到了。)
<?php

$value = 'one';   // this can be turned into an array and looped through
$query1 = "SELECT sum(times_chosen) FROM `b_table` WHERE `levelname` = '$value'";
$count =  /* result from $query1 */
$count = $count + 1; // increment the value for this selection

// get the list of items by order of percentage chance highest to lowest
$query2 = "SELECT id, percentage_chance, times_chosen, name FROM `b_table` WHERE `levelname` = '$value' ORDER BY percentage_chance DESC";
$records = /* results from query 2 */
// percentage_chance INT (.01 to 1) 10% to 100%
foreach($records as $row) {
    if(ceil($row['percentage_chance'] * $count) > $row['times_chosen']) {
        // chose this record to use and increment times_chosen
        $selected_record = $row['name'];
        $update_query = "UPDATE `b_table` SET times_chosen = times_chosen + 1 WHERE id = $row['id']";
        /* run query against DB */
        // exit foreach (stop processing records because the selection is made)
        break 1;
    }
}

// check here to make sure a record was selected, if not, then take record 1 and use it but
// don't forget to increment times_chosen

?>
$records = array(
    1 => array(
        'id' => 1001, 'percentage_chance' => .67, 'name' => 'Function A', 'times_chosen' => 0,
    ),
    2 => array(
        'id' => 1002, 'percentage_chance' => .21, 'name' => 'Function A', 'times_chosen' => 0,
    ),
    3 => array(
        'id' => 1003, 'percentage_chance' => .12, 'name' => 'Function A', 'times_chosen' => 0,
    )
);