嘟嘟社区

[美国VPS] php大佬帮忙看一下中不?


$sum=5000;//总数
//循环取数据
for($i=1;$i<=20;$i++){
  $offset=mt_rand(1,$sum);
  $sql="s。。e。论坛发不出来。l。e。。c。。t * from __md limit $offset,1";
  $randxxx=rand(200,999); //随机数
  $re = $db->_query($sql);
    while ($r = $db->_object($re)) {
        $result[] = $r;
    }
}

这代码的意思是随机从数据库中取一个值,20次,也就是20个值,每个都不一样,成功了。

但是$randxxx这个随机数为什么20个都一样啊?

我需要$randxxx不一样的。请问大佬应该怎么改呢?本人菜鸟,希望大佬能直接改出代码。

模板里是:

{loop $result $v}
{$v->qh}{$randxxx}
{/loop}

参考官方文档

https://www.php.net/manual/zh/function.srand.php

baidu是个好东西
  1. /*
  2. * array unique_rand( int $min, int $max, int $num )
  3. * 生成一定数量的不重复随机数
  4. * $min 和 $max: 指定随机数的范围
  5. * $num: 指定生成数量
  6. */
  7. function unique_rand($min, $max, $num)
  8. {
  9.     //初始化变量为0
  10.     $count = 0;
  11.     //建一个新数组
  12.     $return = array();
  13.     while ($count < $num) {
  14.         //在一定范围内随机生成一个数放入数组中
  15.         $return[] = mt_rand($min, $max);
  16.         //去除数组中的重复值用了“翻翻法”,就是用array_flip()把数组的key和value交换两次。这种做法比用 array_unique() 快得多。
  17.         $return = array_flip(array_flip($return));
  18.         //将数组的数量存入变量count中
  19.         $count = count($return);
  20.     }
  21.     //为数组赋予新的键名
  22.     shuffle($return);
  23.     return $return;
  24. }

复制代码

另外,看起来你不考虑效率,那么可以使用msql的order by rand()

因为在每次循环 $randxxx都会不新值覆盖  导致在模版里$randxxx是最后一次循环中的随机数
解决方案1、在for外面定义$randxxx数组 每次循环的随机数追加到数组里面  然后在模版里根据下标取值
解决方案2、$randxxx的随机数 放到模版里面
是不是可以换个思路:
1、数据表主键ID如果是连续的,先随机20个数字,再一次性去数据库里取;
2、数据表主键ID如果不连续,直接把主键ID取出来,随机20个数,再获取具体数据。
当然,这种方法仅限数据表的数据量不是很大。不过,如果大于 10万+条,limit 效率降低也很大。
不过看你写的 5000,那数据量还好