我设置了一个游戏脚本,当它创建一个新角色时,我希望它为该玩家的房子找到一个空地址。
它插入的两个相关表字段是'city'和'number'。 “城市”是10个随机数,“数字”可以是1-250。
它需要做的是确保不存在它在'HOUSES'表中找到的2个随机数的条目,如果有,则更改数字。重复,直到找到未使用的“地址”,然后插入。
我有一个方法设置来做这个,但我知道这是粗制滥造 - 可能有一些更合乎逻辑和更简单的方法。有什么想法吗?
这是我目前的代码:
$found = 0;
while ($found == 0) {
$num = (rand()%250)+1; $city = (rand()%10)+1;
$sql_result2 = mysql_query("SELECT * FROM houses WHERE city='$city' AND number='$num'", $db);
if (mysql_num_rows($sql_result2) == 0) { $found = 1; }
}
答案 0 :(得分:0)
按照你说的方式进行操作可能会导致问题,只有一对(甚至左一)。脚本可能需要很长时间才能找到一个空房子。
我建议做的是在数据库中插入所有2500条记录(组合1-10和1-250),如果它是空的,则用它标记(或者用用户<>创建一个组合表)房子)和它匹配。
使用MySQL,您可以从数据库中选择一个随机条目,在任何时候都是空的!
因为它只有2500条记录,所以你可以ORDER BY RAND() LIMIT 1
获得随机行。当你有更多的记录时,我不推荐这个。
答案 1 :(得分:0)
您可以像在PHP中一样使用,也可以使用MySQL触发器。
如果您坚持PHP方式,那么不要每次都生成一个数字,而是做这样的事情
$found = 0;
$cityarr = array();
$numberarr = array();
//create the cityarr
for($i=1; $i<=10;$i++)
$cityarr[] = i;
//create the numberarr
for($i=1; $i<=250;$i++)
$numberarr[] = i;
//shuffle the arrays
shuffle($cityarr);
shuffle($numberarr);
//iterate until you find n unused one
foreach($cityarr as $city) {
foreach($numberarr as $num) {
$sql_result2 = mysql_query("SELECT * FROM houses
WHERE city='$city' AND number='$num'", $db);
if (mysql_num_rows($sql_result2) == 0) {
$found = 1;
break;
}
}
if($found) break;
}
这样您不会多次检查相同的值,并且仍然会随机检查。
但是您应该考虑在循环之前获取所有记录,因此您只有一个查询。这也会大大提高性能。
像
$taken = array();
for($i=1; $i<=10;$i++)
$taken[i] = array();
$records = mysql_query("SELECT * FROM houses", $db);
while($rec = mysql_fetch_assoc($records)) {
$taken[$rec['city']][] = $rec['number'];
}
for($i=1; $i<=10;$i++)
$cityarr[] = i;
for($i=1; $i<=250;$i++)
$numberarr[] = i;
foreach($cityarr as $city) {
foreach($numberarr as $num) {
if(in_array($num, $taken[]) {
$cityNotTaken = $city;
$numberNotTaken = $number;
$found = 1;
break;
}
}
if($found) break;
}
echo 'City ' . $cityNotTaken . ' number ' . $numberNotTaken . ' is not taken!';
我会选择这种方法: - )