【问题标题】:Transforming an array into matrix in php在php中将数组转换为矩阵
【发布时间】:2020-04-01 20:33:27
【问题描述】:

我正在尝试为 Rokudoku(数独的 6x6 版本)编写代码。

我已经为六独准备了桌子;这意味着我不必每次都生成 Rokudoku 表。

这是我的构造函数:

const row = 6, column=6;
public $grid_number;
public $numbers=array(); 


function __construct()
{
   (...some code...)

    $this->numbers=array(0, 0, 4, 0, 0, 0, 
                         0, 0, 0, 2, 3, 0, 
                         3, 0, 0, 0, 6, 0,  
                         0, 6, 0, 0, 0, 2, 
                         0, 2, 1, 0, 0, 0, 
                         0, 0, 0, 5, 0, 0);

    foreach ($numbers as $element)
        for($i = 1; $i < Rokudoku::row+1; $i++)
            for($j = 1; $j < Rokudoku::column+1; $j++)
                $this->grid_number[$i][$j] = $element;



    }

我的问题是:我如何将数组转换为矩阵,以便以后我可以将每个数字作为 [row][column] 访问,因为我的想法不起作用。

例如,数组中的数字 4 是:grid_number[1][3]。

对不起,如果这是一个微不足道的问题。这是初学者的工作。谢谢! :)

【问题讨论】:

    标签: php arrays matrix


    【解决方案1】:

    我不熟悉六独,但请考虑以下示例:

    $numbers = array(
        0, 0, 4, 0, 0, 0,
        0, 0, 0, 2, 3, 0,
        3, 0, 0, 0, 6, 0,
        0, 6, 0, 0, 0, 2,
        0, 2, 1, 0, 0, 0,
        0, 0, 0, 5, 0, 0);
    
    function getNumber($numbers, $row, $column){
    
        $position = $row * 6 - (6 - $column); // the two 6s are your consts.
        return $numbers[$position - 1]; // -1 because arrays count from 0, not 1.
    };
    
    $number = getNumber($numbers, 1, 3);
    

    您的数组,尽管它看起来 像一个矩阵,但它只是一个数字列表,您也可以像[0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 3, 0, 0, 0, 6, 0, 0, 6, 0, 0, 0, 2, 0, 2, 1, 0, 0, 0, 0, 0, 0, 5, 0, 0]; 这样写下来。意识到这一点后,您可以像我对getNumber 所做的那样编写一个简单的函数,通过简单的计算找到正确的元素。

    您可以看到一个工作示例here

    【讨论】:

    • 您的方法中有硬编码的行和列大小。我认为重用该代码不是一个好主意。但是想法真的很好。您可以根据需要准确地检索该元素。
    【解决方案2】:

    嗯,

    <?php
    
        $row = $col = 6;
    
        $numbers = [
            0, 0, 4, 0, 0, 0, 
            0, 0, 0, 2, 3, 0, 
            3, 0, 0, 0, 6, 0,  
            0, 6, 0, 0, 0, 2, 
            0, 2, 1, 0, 0, 0, 
            0, 0, 0, 5, 0, 0
        ];
    
        $result = [];
    
        for($i = 0; $i < count($numbers); $i++) {
            $y = intdiv($i, $col);
            $x = $y * $col + ($i % $row) % $row;
            $result[$y][$x] = $numbers[$i];
        }
    
        print_r($result);
    

    【讨论】:

      【解决方案3】:

      使用array_chunk() 拆分数组的简单解决方案...

      $rowSize = 6;
      
      $numbers = [
          0, 0, 4, 0, 0, 0,
          0, 0, 0, 2, 3, 0,
          3, 0, 0, 0, 6, 0,
          0, 6, 0, 0, 0, 2,
          0, 2, 1, 0, 0, 0,
          0, 0, 0, 5, 0, 0
      ];
      
      $result = array_chunk($numbers, $rowSize);
      print_r($result);
      

      唯一的问题是数组是基于 0 的,所以 4 将是 [0,2] 而不是 [1,3]。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多