Преобразование массива в матрицу за php - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь написать код для Рокудоку (версия Судоку 6x6).

Я уже подготовил таблицу для Рокудоку; то есть мне не нужно каждый раз генерировать таблицу Рокудоку.

Вот мой конструктор:

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;



    }

Мой вопрос: как я могу преобразовать массив в матрицу, чтобы позже я мог получить доступ к каждому числу как [строка] [столбец], так как мой идея не работает.

Например, число 4 в массиве: grid_number [1] [3].

Извините, если это тривиальный вопрос. Это работа для начинающих. Спасибо! :)

Ответы [ 4 ]

0 голосов
/ 02 апреля 2020

Простое решение, использующее 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].

0 голосов
/ 01 апреля 2020

Хмм,

<?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);
0 голосов
/ 02 апреля 2020

Боа тарде! Não intendi muito bem, oque Precisa. Mas se Precisa Acesar O Valor 4 dessa forma tente isso:

<?php
class teste
{

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


    public function __construct()
    {

        $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
        );

        $i = 0;
        $column = [];
        foreach ($this->numbers as $element){
            $i++;

            array_push($column, $element);

        if ($i ==  $this->column) {
            array_push($this->grid_number, $column);
            $i = 0;
            $column = [];
        }
        } 

    }
}


$teste = new teste();

echo '<pre>';

print_r($teste->grid_number[0][2]); // For example, number 4 in an array is: grid_number[1][3].
0 голосов
/ 01 апреля 2020

Я не знаком с Rokudoku, но рассмотрим следующий пример:

$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, чтобы найти правильный элемент с простым вычислением.

Вы можете увидеть рабочий пример здесь .

...