2

私はオンライン調査ページに関する私の会社の Web ページに取り組んでいます。カスタマー サービス チームは、いくつかのチェックボックスの質問をデータベースに入力するだけです。私の仕事は、それらをページに表示し、プレーヤーの回答をデータベースに集めることです。

たとえば、データベースに 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 に答える