5

我想从 1 循环到 5。如果你使用 for 循环,这很容易:

for ($i=1; $i<=5; $i++)
{
 // do something
}

但是想象一下,我不是从 $i=1 开始,而是从 1 到 5 随机开始编号,这次它的值为 3。所以我必须从 3 开始循环,循环序列应该是:3,4,5,1 ,2

我已经有了随机数,假设它是 3,那么我需要 3 4 5 1 2 .. 如果是 5,我将需要 5 1 2 3 4

我怎样才能做到这一点??

非常感谢!

4

5 回答 5

5

您想从某个随机点(偏移量)开始,然后循环 5:

$offset = rand(1,5);
for ($i=1; $i<=5; $i++)
{
  echo (($i + $offset ) % 5) + 1;
}
于 2012-09-24T13:46:37.917 回答
2

好吧,将$i迭代 from这意味着您可以创建另一个等效于的变量,但当然它会导致以下计数:15$j$i + 2

3, 4, 5, 6, 7

这就是模运算符 ( %) 的用武之地,模运算符为您提供除以第二个数字后的余数:

3 % 5 //3
7 % 5 //2

如果您从1to迭代5并添加 2 ( 3-7),并获取 result mod(5),您将得到:

方程:

$j = ($i + 2) % 5

3, 4, 0, 1, 2

这接近你想要的,但并不完全。因此,不是2最初添加,而是最初添加1,然后在模数结果之后再次添加:

$j = $i;
$j += 1;
$j %= 5;
$j += 1;
//or in one line:
$j = (($i + 1) % 5) + 1;

这将为您提供一系列3, 4, 5, 1, 2.

要使用随机偏移量,只需确保初始填充在一组 5 个连续正整数中随机化:

//this could be rand(0, 4) or rand(101, 105)
//it doesn't actually matter which range of 5 integers
//as the modulus operator will bound the results to the range of 0-4
$offset = rand(1, 5);
for ($i = 1; $i <= 5; $i++) {
    $j = (($i + $offset) % 5) + 1;
}
于 2012-09-24T13:52:47.720 回答
1

试试这个 :

for ($i = 0, $j = 3; $i < 5; $i++)
{
   echo $j;
   $j %= 5;
   $j++;
}

你需要两个变量来做你想做的事。如果你设置 J = 3,它会做 3 4 5 1 2

玩得开心。

于 2012-09-24T13:48:42.010 回答
1

一些(比我以前更好的)分步示例:

首先,您希望有 5 个数字,这就是您进行循环的原因。这可以写成从 0 到 4 的计数器:

for ($i = 0; $i < 5; $i++) { ...

然后你指定你的起始值。如果将其放入变量中并与计数器变量一起增加,则可以从 1 计数到 5:

for ($i = 0, $j = 1; $i < 5; $i++, $j++) { ...
             ^^^^^^                ^^^^

$i是计数器,$j包含您要查找的值。

如本例所示,确定要执行的步骤数的逻辑已与增加循环变量分开。

现在您需要添加检查是否$j高于 5,如果高于 5,则应将其重置为 1。但是,一个很好的方法是使用模运算符。这意味着,在增加 之前$j,它将被设置为自身除以 5 的余数。这就是%PHP 中的模运算,运算符:

for ($i = 0, $j = 3; $i < 5; $i++, $j %= 5, $j++) { ...
                                   ^^^^^^^

现在你已经有了for创造价值的循环。

在此示例中,您可以将 替换为3您的随机起始编号。注意它大于 0 且小于 6,否则至少第一次迭代会给你一个错误的数字。

您可以想象有多种方法可以做到这一点,所以这只是一个例子。

于 2012-09-24T14:48:53.383 回答
0
 $i = array(3,4,5,1,2); //considering you want to follow this order, and not random.
 foreach($i as $v) {
 //do something
 }
于 2012-09-24T13:46:00.610 回答