Php 将列表分成三列

Php 将列表分成三列,php,mysql,list,loops,divide,Php,Mysql,List,Loops,Divide,我有一个要从数据库中获取的值列表。列表可能很长,所以如果它有超过15个项目,我想分成两列,如果它有超过30个项目,我想分成三列。我怎样才能把它分成3列。例如 01 | 12 | 23 02 | 13 | 24 03 | 14 | 25 04 | 15 | 26 05 | 16 | 27 06 | 17 | 28 07 | 18 | 29 08 | 19 | 30 09 | 20 | 31 10 | 21| 11 | 22| 现在我使用的是表,它在每个循环的开头都有巨大的if嵌套 $res

我有一个要从数据库中获取的值列表。列表可能很长,所以如果它有超过15个项目,我想分成两列,如果它有超过30个项目,我想分成三列。我怎样才能把它分成3列。例如

01 | 12 | 23

02 | 13 | 24

03 | 14 | 25

04 | 15 | 26

05 | 16 | 27

06 | 17 | 28

07 | 18 | 29

08 | 19 | 30

09 | 20 | 31

10 | 21|

11 | 22|

现在我使用的是表,它在每个循环的开头都有巨大的if嵌套

    $result = mysql_query("SELECT namecount FROM table WHERE name='$myvar'");

        if (!$result)
            echo 'MySQL Error: ' . mysql_error();
        else
        {
            while ($row = mysql_fetch_array($result))
            {
                $namecount= $row['namecount'];
                for($i=1;$i<=$namecount;$i++)
                {
                    if($namecount>15)
                    {
                        if($i==1)
                            echo "\n<table><tr><td width=\"200px\">";
                            
                        if($namecount%2==0)
                        {
                            if($i==$namecount/2)
                                echo "</td>\n<td>"; 
                        }
                        else
                        {
                            if($i==($sailiot+3)/2)
                                echo "</td>\n<td>";
                        }
                    }

                //Print content here
                
                if($namecount>15)
                    {
                        if($namecount%2!=0 && $i==$namecount)
                            echo "<h3>&nbsp;</h3><p>&nbsp;<br>&nbsp;</p>"; //if last item and count is odd, print empty item
                            
                        if($i==$namecount)
                            echo "\n</td></tr></table>\n";                  
                    }
                }
            }
        }
这种方法适用于两列,但是三列呢?

我会从内部循环中提取,这样可以节省额外的ifs。要拆分为多个列,可以计算列中的项数,并引入第二个列内变量来跟踪:

while ($row = mysql_fetch_array($result)) {
    $namecount = $row['namecount'];

    // calculate items per column
    $columns = 1;
    if ($namecount > 15)
        $columns = 2;

    if ($namecount > 30)
        $columns = 3;

    $items = $namecount / $columns;
    if ($namecount % $columns > 0)
        ++$items;

    echo "\n<table><tr><td width=\"200px\">";
    for ($i = 1, $j = 1; $i <= $namecount; $i++, $j++) {
        if ($j > $items) {
            echo "</td>\n<td>";
            $j = 1; // reset for new column
        }

        // Print content here
    }

    if ($namecount % 2 != 0) {
         // if count is odd, print empty item
        echo "<h3>&nbsp;</h3><p>&nbsp;<br>&nbsp;</p>";
    }

    echo "\n</td></tr></table>\n";
}
使用

你可以试试这个

  $result = mysql_query("SELECT namecount FROM table WHERE name='$myvar'");

    if (!$result)
        echo 'MySQL Error: ' . mysql_error();
    else
    {
        while ($row = mysql_fetch_array($result))
        {
         $namecount= $row['namecount'];

      for($i=1;$i<=$namecount;$i++)
            {
              if($namecount<=15){
                echo "<table><thead><tr><th>".$your_variable_data."</th></tr></thead>";}
   else if ($namecount >15 and $namecount <=30){
     echo "<thead><tr><th>".$your_variable_data."</th></tr></thead></table>";

       }
          }
       }
它没有经过测试,但是如果你想要更多的话,它应该可以用于3列,如果需要的话,可以添加else。 这里有一个演示如何将它

我发现CSS3多列在浏览器之间非常不一致,带有float:left、white space:nowrap等的错误元素导致它崩溃

因此,我编写了以下蛮力collator,它保留键=>值对

// vars

    $list = array('a','b','c','d','e','f','g','h','i','j','k','l','m',
                    'n','o','p','q','r','s','t','u','v','w','x','y','z');
    $columns = 3;

// sort it

    $count = count($list);
    $base = ceil($count/$columns);

    $keys = array_keys($list);
    for ($i=0;$i<$columns;$i++) {
        for ($j=0;$j<$base;$j++) {
            if (!empty($keys)) {
                $col[$i][] = array_shift( $keys );
            }
        }
    }

    $sorted = array();
    for ($j=0;$j<$base;$j++) {
        for ($i=0;$i<$columns;$i++) {
            if (isset($col[$i][$j])) {
                $sorted[$col[$i][$j]] = $list[$col[$i][$j]];
            }
        }
    }

// check output

    echo '<div style="float:left;margin-right:20px"><h3>ORIGINAL</h3>';
    foreach ($list as $k=>$v) echo $k .' = '. $v.'<br>';
    echo '</div>';

    echo '<div style="float:left"><h3>SORTED</h3>';
    foreach ($sorted as $k=>$v) echo $k .' = '. $v .'<br>';
    echo '</div>';

该代码打印空表。这是你使用的真实代码吗?它只是一列数据//打印内容在这里添加项目。它很长,很少有疑问,所以我把它删掉了。将其更改为echo$i

;或者让它打印一些东西给你。这不完全是我想要的,但已经足够近了。你知道如果它有30多个项目,不管有多少,我怎么能把它平均分成三列吗?你想要1列、2列或3列,永远不要更多?这很有效,谢谢。尽管我建议$j=1;当重新设置为新列。@ USE1829015如果这解决了你的问题,考虑一下。非常感谢。
// vars

    $list = array('a','b','c','d','e','f','g','h','i','j','k','l','m',
                    'n','o','p','q','r','s','t','u','v','w','x','y','z');
    $columns = 3;

// sort it

    $count = count($list);
    $base = ceil($count/$columns);

    $keys = array_keys($list);
    for ($i=0;$i<$columns;$i++) {
        for ($j=0;$j<$base;$j++) {
            if (!empty($keys)) {
                $col[$i][] = array_shift( $keys );
            }
        }
    }

    $sorted = array();
    for ($j=0;$j<$base;$j++) {
        for ($i=0;$i<$columns;$i++) {
            if (isset($col[$i][$j])) {
                $sorted[$col[$i][$j]] = $list[$col[$i][$j]];
            }
        }
    }

// check output

    echo '<div style="float:left;margin-right:20px"><h3>ORIGINAL</h3>';
    foreach ($list as $k=>$v) echo $k .' = '. $v.'<br>';
    echo '</div>';

    echo '<div style="float:left"><h3>SORTED</h3>';
    foreach ($sorted as $k=>$v) echo $k .' = '. $v .'<br>';
    echo '</div>';