#php #variables #random #foreach
#php #переменные #Случайный #foreach
Вопрос:
Я изо всех сил пытаюсь разобраться в том, что я здесь делаю, но сталкиваюсь с некоторыми трудностями… Буду признателен за любую помощь или направление.
Итак, у меня есть некоторые значения в таблице, которые я извлек в соответствии с массивом (блестяще названным $ 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 ;
}
Теперь я не могу понять, куда идти дальше. $ evochance представляют процентные шансы, которые связаны с каждым значением $.
Допустим, с помощью какой-либо функции выбрана переменная с благоприятным значением 60%, затем она вставит значение $, с которым она связана, в другую таблицу.
Я знаю, что это не поможет, но максимум, что я придумал, это:
if (mt_rand(1,100)<$evochance) {
$valid = "True";
}
else {
$valid = "False";
}
echo "$value chance: $evochance ($valid)<br />n"; // Added just to see the output.
Ну, это, очевидно, не то, что я ищу. И я действительно не могу получить динамическое количество процентов с помощью этого метода. Кроме того, это иногда выводит значение False для обоих, а в других случаях — значение True для обоих.
Итак, я любитель, изучающий основы, и я попробовал это. Приветствуется любое направление. Спасибо =)
** Правка 3 (очищена):
@cdburgess Прошу прощения за мои слабые объяснения; я тоже пытаюсь это понять. Надеюсь, вы сможете разобраться в этом.
Пример того, что находится в моем массиве: $array = array('one', 'two', 'three')
Ну, допустим, в $array
, как указано выше, есть 3 значения (хотя это не всегда будет 3 при каждом запуске этого скрипта). Я собираю все записи из таблицы, которые содержат эти значения в определенном поле (называемом ‘levelname’). Поскольку эти значения уникальны для каждой записи, она будет извлекать только столько записей, сколько в них значений. Теперь каждая запись в этой таблице имеет поле с именем evochance
. В этом поле находится единственное число от 1 до 100. 3 записи, которые я запрашивал ранее (в пределах foreach ()
), будут иметь evochance
числа, которые в сумме равны 100. Нужная мне функция решает, какую запись я буду использовать, на основе номера ‘evochance’, который она содержит. Если оно равно 99, то я хочу, чтобы оно использовалось в 99% случаев при запуске этого скрипта.
ОДНАКО… Мне не нужна простая функция взвешенного шанса для одного числа. Я хочу, чтобы он выбирал, какой процент = true из n процентов (когда n = количество значений в массиве). Таким образом, процент, возвращаемый как true, будет относиться к levelname
, чтобы я мог его выбрать (или, по крайней мере, это то, что я пытаюсь сделать).
Также, для пояснения: выбранная запись будет содержать уникальную информацию в одном из своих полей (это одно из уникальных значений из $array
, с помощью которого я запрашивал таблицу ранее). Затем я хочу ОБНОВИТЬ другую таблицу (a_table) этим значением.
Итак, вы видите, единственное, что я не могу понять, это функция выбора процентного шанса… Для меня это довольно сложно, и я, возможно, буду действовать обходным путем, поэтому, если есть альтернативный способ, я бы обязательно попробовал. К ответу, который я получил: я пробую это сейчас и смотрю, что я могу сделать. Спасибо за ваш вклад =)**
Комментарии:
1. Какого фактического конечного результата вы хотите достичь? Т.е. высокоуровневое описание того, чего должен достичь весь этот код. Если это просто подтасовка чисел, вы, вероятно, можете сделать то же самое полностью в базе данных с помощью одного запроса.
2. Первое изменение: экранируйте свой ввод в MySQL!
3. @Deal Я вижу много, много предлагаемых изменений 🙂
4. Когда это выполняется, я хочу, чтобы оно обновило поле в отдельной таблице значением levelname, которое соответствует проценту, который выводится как true … если это имеет смысл.
5. @Delan: Используя mysql_escape_string() ? D:
Ответ №1:
Я думаю, я понимаю, о чем вы спрашиваете. Если я правильно понимаю, «процентная вероятность» — это то, как часто следует выбирать запись. Чтобы определить это, вы должны фактически отслеживать, когда выбрана запись, увеличивая значение каждый раз, когда используется запись. В том, что вы делаете, нет ничего «случайного», поэтому функция 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
?>
Это должно объясняться само собой, но в двух словах, вы сначала указываете процедуре упорядочивать записи базы данных по наибольшему процентному шансу. Затем, если процентный шанс больше общего, пропустите его и перейдите к следующей записи.
ОБНОВЛЕНИЕ: Итак, учитывая этот набор записей:
$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,
)
);
Запись 1 будет выбираться в 67% случаев, запись 2 — в 21% случаев и запись 3 — в 12% случаев.
Комментарии:
1. Спасибо — это помогло тоннам. Это работает более или менее так, как я хотел — ты звезда!
2. Рад помочь! Мне потребовалось немного поработать, чтобы понять, но, думаю, я наконец-то добрался туда. 😉
Ответ №2:
$sum = 0;
$choice = mt_rand(1,100);
foreach ($array as $item) {
$sum = chance($item); // The weight of choosing this item
if ($sum >= $choice) {
// This is the item we have selected
}
}
Если я вас правильно понял, вы хотите выбрать один из элементов из массива с некоторой вероятностью выбора каждого из них. Этот метод сделает это. Убедитесь, что сумма вероятностей равна 100.