如何在数组中允许重复的mysql行id?

时间:2017-12-24 05:51:25

标签: php mysql arrays

t1中的数据如下(仅2条记录),

+-----------+-----------------+----------+
| shid      | lvlmin          | lvlmax   |
+-----------+-----------------+----------+
| 1         | 1               | 10       |
| 2         | 5               | 10       |
+----------------------------------------+

我的PHP代码是:

$userinfo[0] = '9';
$ghunt = DB::fetch_all("SELECT shid FROM t1 
     WHERE lvlmin <= ".$userinfo[0]." AND lvlmax >= ".$userinfo[0].
    "ORDER BY rand() LIMIT 5");
print_r($ghunt);

结果有2个数组:

Array ( [0] => Array ( [shid] => 2 ) [1] => Array ( [shid] => 1 ) )

当数组结果小于mysql查询中的LIMIT 5时,如何自动使用$ghunt中的数组结果来填充数组?

我的意思是:

Array ( 
  [0] => Array ( [shid] => 2 )
  [1] => Array ( [shid] => 1 ) 
  [2] => Array ( [shid] => 2 ) 
  [3] => Array ( [shid] => 1 ) 
  [4] => Array ( [shid] => 1 )
)

shid可以是数组中的随机位置。

2 个答案:

答案 0 :(得分:1)

我不编码PHP,但我可以描述一种简单实现目标的方法。大多数语言都有一个MOD运算符,通常是% - mod的php手册页是here

它给出了除法运算的余数,因此10 mod 3为1,因为10除以3是9余数1

然后,MOD的一个有用属性是,它总是在0到1之间循环,比你所修改的要少。如果将增量数修改为5,则结果将始终为0,1,2,3,4,0,1,2,3,4。这意味着你可以有一个带有一些递增数的for循环,mod一个数组长度,结果将是一个整数,当然是一个数组索引。如果循环变量高于数组的末尾,则mod运算符将使其再次循环到数组的开头

MyArray[ 1746262848 mod MyArray.length ] 

肯定不会崩溃,即使数组只有2个项目

所以对于你的情况,只需要一个循环..让他跟随伪代码进入PHP

// run the loop 5 times
For I as integer = 0 to 4 do
  Print MyArray[ i mod MyArray.length ]

如果阵列中有2个项目A和B,它只会打印ABABA

如果您有3个项目A B C,它将打印ABCAB

希望这些信息对您在PHP中实现解决方案以及未来的许多问题都有所帮助。在使用数组

时,Mod对于实现各种操作非常有用

答案 1 :(得分:1)

你为什么不这样做?

If (count($ghunt) < 5){
    $realResultCount = count($ghunt);
    for ($i = realResultCount; $i <= 5; $i++){
        $ghunt[$i] = $ghunt[rand(0,realResultCount-1)];
    }
}

基本上,上面代码的作用是,如果ghunt中的记录少于5条,则通过从最初返回的记录中随机选择记录,它最多可以达到5条。