创建一个 N x N 个整数数组,用于“阶梯”和“环绕”


Creating an N x N array of integers that "staircase" and "wrap around"

我在尝试弄清楚如何按如下所示排序数据时遇到麻烦。总数无关紧要;它将遵循任何数字的相同模式,逻辑顺序为 0、1、2、3、4、5、6 等。所以本质上,从 0、2、3、4 等开始,其中 1 将放在最大数字之后,其中 0 可以是我静态设置的变量。我在一直进展到最大数量然后继续时遇到问题,例如

..., 97, 98, 99, 100, 1, 2, ...

然后随着订单进行,

..., 98, 99, 100, 1, 2, 3, ...

依此类推,直到 1、2、3、4、5、6、...

并将所有这些存储到下面的多维数组中。

$set = array(
    array('0','0','0','0','0','0','0','0','0','0','0'),
    array('0','2','3','4','5','6','7','8','9','10','1'),
    array('0','3','4','5','6','7','8','9','10','1','2'),
    array('0','4','5','6','7','8','9','10','1','2','3'),
    array('0','5','6','7','8','9','10','1','2','3','4'),
    array('0','6','7','8','9','10','1','2','3','4','5'),
    array('0','7','8','9','10','1','2','3','4','5','6'),
    array('0','8','9','10','1','2','3','4','5','6','7'),
    array('0','9','10','1','2','3','4','5','6','7','8'),
    array('0','10','1','2','3','4','5','6','7','8','9'),
    array('0','1','2','3','4','5','6','7','8','9','10'),
); 

我做了上述操作,因为我无法找出循环模式;如果我能弄清楚这一点,我就不需要手动输入数据,并且可以创建一个表单,通过该表单可以选择任何数字,遵循这种模式。

请注意,除了第一行和第一列之外,每一行都只是前一向左移动,下一个值添加在:

$max = 10;
// First row (full of 0)
$set = array(array_fill(0, $max + 1, 0));
$row = array();
for($i = 1; $i <= $max; $i++)
    $row[] = $i;
$row[] = 1; // $row  = [2,3,4,...,$max,1]
for($i = 0; $i < $max; $i++){
    $set[] = array_merge(array(0), $row);
    $row = array_map(function($x) use ($max){ // Requires PHP 5.3
        $result = ($x + 1) % $max;
        return 0 === $result ? $max : $result;
    }, $row);
}

代码板

如果需要,制作此存储字符串而不是整数当然是相当简单的。

$array = array();
$max = 10;
for ($i = 0; $i < $max; $i++)
{
    $num = $i + 2;
    $array[$i][] = 0;
    for ($j = 0; $j < $max; $j++)
    {
        if ($num == $max + 1)
            $num = 1;
        $array[$i][] = $num;
        $num++;
    }
}
var_dump($array);