绘制网格中的位置

时间:2018-02-26 01:36:46

标签: php arrays for-loop

我有一个动态网格和每个人的x和y分数列表 - 只有这些,我如何确定哪个"框"把每个人都放进去?

由于网格是动态的,我试图弄清楚如何使用数组来避免硬编码 - 我正在遍历所有人并将它们添加到包含x和y的数组(我可以重做这个如果它更容易)。有了这些值,我怎么能在网格中循环并选择每个盒子里的人?我怀疑我是在思考,但我无法让它发挥作用。

例如,让我们假设网格为7 x 5

Array ( ["Bob"] => Array ( ["x"] => 3 ["y"] => 4 )
Array ( ["Fred"] => Array ( ["x"] => 4 ["y"] => 2 )
Array ( ["Tom"] => Array ( ["x"] => 1 ["y"] => 5 )
Array ( ["Joan"] => Array ( ["2"] => 3 ["y"] => 3 )

如果网格从左下角开始编号,如:

29 30 31 32 33 34 35
22 23 24 25 26 27 28
15 16 17 18 19 20 21
8  9  10 11 12 13 14
1  2  3  4  5  6  7
然后鲍勃应该在24岁,弗雷德在11岁,汤姆在29岁,琼在17岁等等。

如何运行循环以将每个人放在正确的位置?

到目前为止,我已经尝试过:

$xEach=100/$xMax/100;

$xArray=array();
for ($i=$xEach; $i<100; $i=$i+$xEach) {
    $xArray[]=$i;
}

$yEach=100/$yMax/100;

$yArray=array();
for ($i=$yEach; $i<100; $i=$i+$yEach) {
    $yArray[]=$i;
}


$x=array();
$y=array();

<loop through people>

    $originalValue=$res['value'];
    $axis=res['axis'];
    $name=$res['name'];

    if ($axis=="x") {
        $newValue=$originalValue/$xMax;
        $hit=0;
        foreach ($xArray as $value) {
            if ($newValue<$value&&$hit==0) {
                $hit++;
                $x["$originalValue"][]=$name;
            }
        }

    } else {
        $type="y";
        $newValue=$originalValue/$yMax;
        $hit=0;
        foreach ($yArray as $value) {
            if ($newValue<$value&&$hit==0) {
                $hit++;
                $y["$originalValue"][]=$name;
            }
        }
    }
</loop>

<div class="customgridwrapper">
    <?php 
        $box=0;
        for ($yLoop=$yMax; $yLoop>=$yMin; $yLoop--) { ?>
        <?php for ($xLoop=$xMin; $xLoop<=$xMax; $xLoop++) {
            $box++;
            ?>
            <div class="griditem">      
                <span><?=$box?></span>
            </div>
        <?php } ?>
    <?php } ?>
</div>

1 个答案:

答案 0 :(得分:1)

我认为你的问题让你复杂化了。因此,为了更容易理解,将其分解为单独的部分。

创建网格

所以第一项任务是创建网格。这可以使用嵌套的PHP数组轻松表示。但是,要记住的一件事是你希望你的网格从左下角开始,而为了简单起见,我们将从左上角构建我们的网格。不过不用担心,当我们来渲染输出时,我们可以轻松解决这个问题。

以下函数将创建一个指定数量为$columns$rows的网格,并相应地初始化单元格$value

function createGrid($columns, $rows)
{
    $grid = [];
    $value = 1;

    for ($r = 0; $r < $rows; $r++) {
        $row = [];

        for ($c = 0; $c < $columns; $c++) {
            $row[] = $value++;
        }

        $grid[] = $row;
    }

    return $grid;
} 

绘制值

您的值基于笛卡尔坐标,从1, 1开始。我们的网格,因为它基于PHP数组实际上是零索引的,所以从0, 0开始。因此,在绘制网格上的值时,我们需要将$x$y值减1以相应地映射它们。

$values = [
    'bob' => [3, 4],
    'fred' => [4, 2],
    'tom' => [1, 5],
    'joan' => [3, 3],
];

function plotGridValues($grid, $values)
{
    foreach ($values as $value => $coordinates) {
        list($x, $y) = $coordinates;
        $grid[$y - 1][$x - 1] = $value;
    }

    return $grid;
}

渲染网格

我们之前提到过,您希望从左下角渲染网格,而我们创建它从左上角开始。在渲染之前,我们需要解决这个问题,并且可以使用array_reverse轻松实现。

我讨厌以这种方式混合PHP和HTML,但为了简单起见,我在echo<table>了HTML。

function renderGrid($grid) 
{
    $grid = array_reverse($grid);

    echo "<table>\r\n";

    foreach ($grid as $row) {
        echo '<tr>';

        foreach ($row as $cell) {
            echo "<td>{$cell}</td>";
        }

        echo "</tr>\r\n";
    }

    echo '</table>';
}

完整代码

狂野!

<?php

$values = [
    'bob' => [3, 4],
    'fred' => [4, 2],
    'tom' => [1, 5],
    'joan' => [3, 3],
];

$grid = createGrid(7, 5);
$grid = plotGridValues($grid, $values);
echo renderGrid($grid);

function createGrid($columns, $rows)
{
    $grid = [];
    $cell = 1;

    for ($r = 0; $r < $rows; $r++) {
        $row = [];

        for ($c = 0; $c < $columns; $c++) {
            $row[] = $cell++;
        }

        $grid[] = $row;
    }

    return $grid;
}

function plotGridValues($grid, $values)
{
    foreach ($values as $value => $coordinates) {
        list($x, $y) = $coordinates;
        $grid[$y - 1][$x - 1] = $value;
    }

    return $grid;
}

function renderGrid($grid) 
{
    $grid = array_reverse($grid);

    echo "<table>\r\n";

    foreach ($grid as $row) {
        echo '<tr>';

        foreach ($row as $cell) {
            echo "<td>{$cell}</td>";
        }

        echo "</tr>\r\n";
    }

    echo '</table>';
}