2

我正在为我的公司制作一个关于在线调查页面的网页,我们的客户服务团队只需将一些复选框问题输入数据库。我的工作是将它们显示在页面上并将玩家的答案收集回我们的数据库。

例如,如果我在数据库中有 12 个问题,我需要将其显示在表格中:

1 5 9
2 6 10
3 7 11
4 8 12

或者,如果我有 13 个问题,它应该显示为
1 6 10
2 7 11
3 8 12
4 9 13
5

这可以用 PHP 中的 if else 来完成,但我想用数学的方式来做,只是为了丰富我的知识。

如果我可以在公式中传递总问题(在这种情况下为 13)和垂直列数(在这种情况下为 3),任何建议或提示都会受到赞赏,并且它只是以这种方式返回数字的顺序 {1, 6, 10、2、7、11、3、8、12、4、9、13、5}

老实说,我不会重写调查页面。我只是好奇这是否可以通过一些数学来完成,而无需在编程中使用 if/else。

4

4 回答 4

1

编辑:

这是我生成数组的最新解决方案,它比以前更加数学化:

$q = 27;//number of questions
$c = 4;//number of columns
$m =  $q%$c;//modulus
$step = floor($q/$c);
$arr = array();
for ($n=0; $n<$q; $n++){
    $arr[] = 1 + $step*($n%$c) + ($m + $n%$c - abs($m - $n%$c))/2 + floor($n/$c);
}

输出如下:

array(1, 8, 15, 22, 2, 9, 16, 23, 3, 10, 17, 24, 4, 11, 18, 25, 5, 12, 19, 26, 6, 13, 20, 27, 7, 14, 21);

原始答案:

$q = 13;//number of questions
$c = 3;//number of columns
$mod = array_fill(0, $c, 0);
for ($i=0; $i<($q%$c); $i++){
    $mod[$i] = 1; 
}
$step = floor($q/$c);
$arr = array();
$cum = 0;
for ($i=0; $i<$c; $i++){
    $cum += @$mod[$i-1];
    $arr[] = 1 + $step*$i + $cum;
}
$next = $arr;
for ($i=1; $i<$step; $i++){
    foreach ($next as $key => $value){
        $next[$key]++;
    }
    $arr = array_merge($arr, $next);
}
for ($i=0; $i<$c; $i++){
    $next[$i] = ($next[$i] + 1)*$mod[$i] ;
}
$arr = array_filter(array_merge($arr, $next));
var_dump($arr);

输出是:

array(1, 6, 10, 2, 7, 11, 3, 8, 12, 4, 9, 13, 5);

这是我生成表格的解决方案:

$q = 27;//number of questions
$c = 4;//number of columns
$cell = '<td>i</td>';
$table = '<table>';
$mod = array_fill(0, $c, 0);
for ($i=0; $i<($q%$c); $i++){
    $mod[$i] = 1; 
}
$step = floor($q/$c);
$arr = array();
$cum = 0;
$table .= '<tr>';
for ($i=0; $i<$c; $i++){
    $cum += @$mod[$i-1];
    $num = 1 + $step*$i + $cum;
    $arr[] = $num;
    $table .= str_replace('i', $num, $cell);
}
$table .= '</tr><tr>';
$next = $arr;
for ($i=1; $i<$step; $i++){
    foreach ($next as $key => $value){
        $num = ++$next[$key];
        $table .= str_replace('i', $num, $cell);
    }
    //$arr = array_merge($arr, $next);
    $table .= '</tr><tr>';
}
$table = substr($table, 0 , -4);
for ($i=0; $i<$c; $i++){
    $next[$i] = ($next[$i] + 1)*$mod[$i] ;
}
$next = array_filter($next);
$span = $c - count($next);
$ini = '';
$fin = '';
$last = '';
foreach ($next as $key => $value){
    $ini = '<tr>';
    $last .= str_replace('i', $value, $cell);
    $fin = '<td span="'.$span.'">&nbsp;</td></tr>';
}
//$arr = array_merge($arr, $next);
$table .= $ini.$last.$fin.'</table>';
echo $table;

有 27 个问题和 4 列,输出为:

<table>
    <tr><td>1</td><td>8</td><td>15</td><td>22</td></tr>
    <tr><td>2</td><td>9</td><td>16</td><td>23</td></tr>
    <tr><td>3</td><td>10</td><td>17</td><td>24</td></tr>
    <tr><td>4</td><td>11</td><td>18</td><td>25</td></tr>
    <tr><td>5</td><td>12</td><td>19</td><td>26</td></tr>
    <tr><td>6</td><td>13</td><td>20</td><td>27</td></tr>
    <tr><td>7</td><td>14</td><td>21</td><td span="1">&nbsp;</td></tr>
</table>

当然,您可以修改 的值$cell以在表格单元格中插入链接或任何您想要的内容。

于 2013-06-07T12:29:29.653 回答
0

您可以通过使用 mod 函数(即 '%' )来尝试这个,也可以在其中使用数组。我在这里有个问题。列数会保持 3 吗?如果是这样,那么您可以采用 3 个不同的数组来按顺序存储记录。然后在每列中显示它们。是的,在这里你不能通过使用单个 html 表来做到这一点,你需要为每一列使用 div。

于 2013-06-07T11:20:12.990 回答
0

下面将第一种情况下的结果作为数组给出。但是当矩阵的所有单元格都没有值时,我认为必须使用 if else 语句

    <?php
    function lists ($total_cells, $vertical_cols) {
      $total = $total_cells;
     $cols = $vertical_cols;
     $hor = (int)($total/$cols);

     $res = array();
    $j=0;
     $current = 1;
      for($j=1;$j<=$hor;$j++){
     $current = $j;
        for($i = 1; $i<=$cols; $i++) {
          $res[$j][] = $current; 
        $current = $current+$hor;
            }
           }
         return $res;
        }


     ?>
于 2013-06-07T12:00:52.203 回答
-1

假设您的复选框存储在一个名为$target.

<?php
$target = array(1,2,3,4,5,6,7,8,9,10,11,12,13);
$target = array_chunk($target, 3); //Split the array into chunks of 3.
$result = array_map(function ($el) {
    return implode("</td><td>", $el); //Implode the inner arrays with table cells 
}, $target);
$result = implode("</td></tr><tr><td>", $result); //Implode the outer arrays with table rows.

echo "<table><tr><td>";
echo $result;
echo "</td></tr></table>";

你会得到一张三人一组的桌子


如果您想要一个确定列数的函数,您只需将数字“3”更改array_chunk为该函数的参数:)

于 2013-06-07T11:20:36.987 回答