【问题标题】:How to print Matrix in PHP如何在 PHP 中打印矩阵
【发布时间】:2022-11-22 03:34:12
【问题描述】:

我想在表中打印随机数,如下图所示。

  1. 18行9列
  2. 每行最多和最少5个数字
  3. 第 1 列 (1-10),第 2 列 (11-20) 直到 90。(1-90)
  4. 不能有重复的数字

    当我刷新页面时,应该更改数字(数字位置)。我已经做到了,但是有几行出错了。

    这是我的代码:

    <?php
    
    
    function dd($data){
        echo '<pre>';
        print_r($data);
        echo '</pre>';
    //    die();
    }
    
    
    
    function getAllColumnIndexes()
    {
        $tmpCols = [];
        $columnIndexes = [];
        for ($l = 1; $l <= 9; $l++) {
            $indexes = [];
    
            $arr = range(1,18);
            while(count($indexes) != 10){
                shuffle($arr);
                if(empty($arr)){
                    break;
                }
                $i = array_shift($arr);
                if(! isset($tmpCols[$i])){
                    $tmpCols[$i] = 0;
                }
    
                if (! in_array($i, $indexes)){
                  
    
                    if($tmpCols[$i] < 5){
                        $indexes[] = $i;
                        $tmpCols[$i] += 1;
                    }
    
    //                if($tmpCols[$i] == 5){
    //                    break 1;
    //                }
    
                }
            }
    
            shuffle($indexes);
            $columnIndexes[$l] = $indexes;
        }
    
    
    
        return $columnIndexes;
    }
    
    
    $numberList = [];
    $startVal = 1;
    $endVal = 10;
    for($i = 1; $i < 10; $i++){
        $numbers = range($startVal, $endVal);
        shuffle($numbers);
        $numberList[$i] = $numbers;
        $startVal += 10;
        $endVal += 10;
    }
    
    $columnIndexes = getAllColumnIndexes();
    
    
    
    ?>
    
    
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Numbers Table</title>
    
        <style>
            body{
                font-family: sans-serif;
                background: #3c6646;
            }
            table{
                border-collapse: collapse;
                margin: 0 auto;
            }
           td {
                border: 1px solid black;
               width: 30px;
               height: 30px;
               text-align: center;
               font-size: 14px;
               font-weight: bold;
            }
    
            tr.active{
                background: #f9f9f9;
            }
            tr.inactive td{
                border: none;
                height: 15px;
            }
    
            @media (min-resolution: 120dpi) {
                table, th, td {
                    border-width: 0.75px;
                }
            }
    
            @media (min-resolution: 144dpi) {
                table, th, td {
                    border-width: 0.666px;
                }
            }
    
            @media (min-resolution: 192dpi) {
                table, th, td {
                    border-width: 0.5px;
                }
            }
        </style>
    </head>
    <body>
    
    
    <table>
        <tbody>
    
        <?php
    
        for ($i = 1; $i < 19; $i++){
            echo '<tr class="active">';
    
            #ROW
    
            for ($j = 1; $j < 10; $j++){
    
                $num = '';
    
                #COLUMN
                $rowNumber = $i;
                $colNumber = $j;
    
                $tmpIndex = array_search($rowNumber, $columnIndexes[$colNumber]);
                if($tmpIndex !== false){
    
                    $num = array_shift($numberList[$j]);
    
                }
    
                echo "<td>{$num}</td>";
            }
            echo '</tr>';
    
            if($i % 3 == 0 && $i != 18){
                echo '<tr class="inactive"> <td colspan="9"></td> </tr>';
            }
    
        } ?>
    
    
        </tbody>
    </table>
    
    </body>
    </html>
    

    演示链接:https://soap2day.vipembed.com/num-table.php

    谁能帮我?

【问题讨论】:

  • 请只显示准确简洁的代码来重现您的问题,而不是整个项目。
  • 你能准确地说出 ` 有几行出错了。 ` 吗?
  • 做什么“每行最多和最少 5 个数字”方法?最小 5 或最大 5 或总是 5?

标签: php


【解决方案1】:

我使用与您的原始代码不同的方法。我不确定诸如最大和最小值之类的一些东西,也不确定是否有重复的数字表示所有这些数字或每个单元格组。

这是代码。

<?php
const MAX_COLUMNS = 9;
const MAX_ROWS = 18;

$generatedNumbers = [];// for use later.


/**
 * Generate random number by row, column and not duplicate with generated.
 *
 * @link https://stackoverflow.com/a/4422911/128761 Count non empty array values.
 * @param integer $row
 * @param integer $column
 * @param array $generatedNumbers
 * @return string
 */
function generateRandomNumber(
    int $row, 
    int $column, 
    array &$generatedNumbers
): string {
    if (!array_key_exists($row, $generatedNumbers)) {
        $generatedNumbers[$row] = [];
    }

    if (!array_key_exists($column, $generatedNumbers[$row])) {
        $generatedNumbers[$row][$column] = '';
    }

    $rowValues = array_values($generatedNumbers[$row]);
    $totalGeneratedThisRow = count(array_filter($rowValues, function($x) {
        return $x !== '';
    }));// count non empty array values.

    if ($totalGeneratedThisRow < 5) {
        $display = mt_rand(0, 1);
        if (1 === $display) {
            $minMaxNumber = getMinMaxByColumn($column);
            $found = true;
            $round = 0;
            do {
                $number = mt_rand($minMaxNumber[0], $minMaxNumber[1]);
                
                $found = isNumberExists($number, $generatedNumbers);

                // use $round to prevent too many loop and cause execution timeout.
                $round++;
                if ($round > 10000) {
                    $number = '';
                    $found = false;
                }
            } while ($found === true);

            $generatedNumbers[$row][$column] = $number;
            return $number;
        }
    }

    return '';
}// generateRandomNumber


/**
 * Check is input number exists in generated.
 *
 * @param int $number
 * @param array $generatedNumbers
 * @return boolean
 */
function isNumberExists(int $number, array $generatedNumbers): bool
{
    foreach ($generatedNumbers as $generatedRow => $generatedColumnItems) {
        foreach ($generatedColumnItems as $generatedColumn => $generatedColumnValue) {
            if ($generatedColumnValue === $number) {
                return true;
            }
        }
        unset($generatedColumn, $generatedColumnValue);
    }
    unset($generatedColumnItems, $generatedRow);

    return false;
}// isNumberExists


/**
 * Get min, max numbers by column.
 *
 * @param integer $column
 * @return array Return `array`. First value is minimum, second is maximum.
 */
function getMinMaxByColumn(int $column): array
{
    $numbersPerColumn = 10;
    $min = ((($column * $numbersPerColumn) - $numbersPerColumn) + 1);
    $max = ($column * $numbersPerColumn);

    return [$min, $max];
}// getMinMaxByColumn
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <style>
            table {
                border-collapse: collapse;
            }
            td, th {
                border: 1px solid #000;
                font-size: 14px;
                font-weight: bold;
                height: 30px;
                text-align: center;
                width: 30px;
            }
            .inactive td,
            .inactive th {
                border: none;
                height: 15px;
            }
        </style>
    </head>
    <body>
        <table>
            <tbody>
                <?php
                $row = 1;
                do {
                    echo '<tr class="active">' . PHP_EOL;

                    $column = 1;
                    do {
                        echo '  <td>';
                        echo generateRandomNumber($row, $column, $generatedNumbers);
                        echo '</td>' . PHP_EOL;

                        $column++;
                    } while ($column <= MAX_COLUMNS);
                    unset($column);

                    echo '</tr>' . PHP_EOL;

                    if ($row % 3 === 0 && $row < MAX_ROWS) {
                        echo '<tr class="inactive"><td colspan="' . MAX_COLUMNS . '"></td></tr>' . PHP_EOL;
                    }
                    $row++;
                } while ($row <= MAX_ROWS);
                ?> 
            </tbody>
        </table>
    </body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多