【问题标题】:PHP Sorting files in a tablePHP对表格中的文件进行排序
【发布时间】:2013-09-20 08:34:49
【问题描述】:

目前我有一个桌子顺序

A B C D

E F G H

但我想按以下顺序订购桌子

A  E

B  F

C  G

D  H

代码:

for($i=0;$i<=count($aFiles);$i++)
{
   if($i%5==0)
   {
      echo "</tr><tr>";
   }

   echo '<td><a>'.$aFiles[$i].'</a></td>';
}
echo '</tr>';
echo '</table>';

文件已在 $aFiles 中按 a-z 排序。

【问题讨论】:

  • HTML 表格是逐行构造的 (&lt;tr&gt;)。如果你按顺序循环你的结果,它不会给你 A > E > B > F ...另外,你假设行数是固定的,因为“E”在第二列。你确定?
  • @ShivanRaptor:代码示例使用count($aFiles)来确定长度,所以在进入循环之前就知道大小了。
  • 但代码仅适用于第一部分。

标签: php html-table rows


【解决方案1】:

$aFiles = array('a','b','c','d', 'e', 'f', 'g');



$iColumnNumber = 2;
$iRowMaxNumber = ceil(count($aFiles) / $iColumnNumber);

$iTableRow = 0;
$iTableColumns = 1;
$aTableRows = array();

// make array with table cells
foreach ($aFiles as $sFile)
{
    if ($iTableRow == $iRowMaxNumber)
    {
        $iTableRow = 0;
        $iTableColumns++;
    }

    if (!isset($aTableRows[$iTableRow]))
    {
        $aTableRows[$iTableRow] = array();
    }

    $aTableRows[$iTableRow][] = '<td>' . $sFile . '</td>';

    $iTableRow++;
}

// if there is odd number of elements
// we should add empty td elements
for ($iTableRow; $iTableRow < $iRowMaxNumber; $iTableRow++)
{
    if (count($aTableRows[$iTableRow]) < $iTableColumns)
    {
        $aTableRows[$iTableRow][] ='<td>empty</td>';
    }
}

// display table
echo '<table>';

foreach ($aTableRows as $aTableRow)
{

    echo '<tr>';
    echo implode('', $aTableRow);
    echo '</tr>';
}

echo '</table>';

【讨论】:

  • 谢谢伙计,大多数答案对我有用,但有了这个我有最大的控制权。 T $aFiles 是文件夹文件的列表,因此每个文件夹的大小都会更改。
【解决方案2】:

没有优化,但这应该或多或少的工作:

$aFiles = array ("A","B","C","D","E","F","G","H","I","J","K","L","M","N",);
$rows = 4;
$columns = floor((count($aFiles)/$rows))+1;

echo '<table>';
for ($i=0;$i<$rows;$i++) {
    echo '<tr>';
    for ($j=0;$j<$columns;$j++) {
        echo '<td>';    
        if (isset($aFiles[$i+$j*$rows]))
            echo $aFiles[$i+$j*$rows];
        else 
            echo "&nbsp;";
        echo '</td>';
    }
    echo '</tr>';    
}
echo '</table>';

您可以根据需要更改行数。

【讨论】:

    【解决方案3】:

    下面的示例也适用于关联数组 + 具有奇数元素的数组。

    关联与索引数组的代码:

    $aFiles = ['test'=>"A","B",'c'=>"C","D","E","F",'g'=>"G","H",'iii'=>"I"];
    $aKeys = array_keys($aFiles);
    $aRows = ceil(count($aFiles) / 2);
    
    echo '<table>';
    for($i=0; $i < $aRows; $i++) {
        echo 
            '<tr>' .
            '   <td>' . $aFiles[$aKeys[$i]] . '</td>' .
            '   <td>' . (isset($aKeys[$i+$aRows]) ? $aFiles[$aKeys[$i+$aRows]] : 'empty') . '</td>' .
            '</tr>';
    }
    echo '</table>';
    

    仅索引数组的代码:

    $aFiles = ["A","B","C","D","E","F","G","H","I"];
    $aRows = ceil(count($aFiles) / 2);
    
    echo "<table>";
    for($i=0; $i < $aRows; $i++) {
        echo 
            "<tr>" .
            "   <td>" . $aFiles[$i] . "</td>" .
            "   <td>" . (isset($aFiles[$i+$aRows]) ? $aFiles[$i+$aRows] : "empty") . "</td>" .
            "</tr>";
    }
    echo "</table>";
    

    两个示例的输出相同:

    <table>
        <tr>
            <td>A</td>
            <td>F</td>
        </tr>
        <tr>
            <td>B</td>
            <td>G</td>
        </tr>
        <tr>
            <td>C</td>
            <td>H</td>
        </tr>
        <tr>
            <td>D</td>
            <td>I</td>
        </tr>
        <tr>
            <td>E</td>
            <td>empty</td>
        </tr>
    </table>
    

    【讨论】:

      【解决方案4】:

      假设您知道所需的行数,则无需采取任何措施,只需在循环中添加一些逻辑即可生成 &lt;td&gt;s :

      $size = count($aFiles);
      echo '<table><tr>';
      for($i=0;$i<=ceil($size/2);$i++) {
        if($i%2==0) {
          echo '<td><a>'.$aFiles[$i].'</a></td>';
          echo "</tr><tr>";
        } else {
          if(isset($aFiles[$i+floor($size/2)])) {
            echo '<td><a>'.$aFiles[$i+floor($size/2)].'</a></td>';
          }
        }
      }
      echo '</tr></table>';
      

      【讨论】:

      • @ShivanRaptor: 不包括&lt;table&gt; &lt;/table,因为无论如何它只包含在答案中。固定。
      【解决方案5】:

      使用 HTML 技巧的简单方法:

      echo '<div class="tbl_group"><table>';
      for($i=0;$i<=count($aFiles / 2);$i++)
      {
         echo '<tr>';
         echo '<td><a>'.$aFiles[$i].'</a></td>';
         echo '</tr>';
      }
      echo '</tr>';
      echo '</table></div>';
      echo '<div class="tbl_group"><table>';
      for($i=$aFiles / 2;$i<=count($aFiles);$i++)
      {
         echo '<tr>';
         echo '<td><a>'.$aFiles[$i].'</a></td>';
         echo '</tr>';
      }
      echo '</tr>';
      echo '</table></div>';
      

      对于 CSS:

      .tbl_group {
        float: left;
      }
      

      使用这种方法,可以并排构建 2 个表。 float: left CSS 会自动调整表格的位置。

      【讨论】:

        【解决方案6】:

        试试这个。假设您的 $aFiles 按字母顺序包含 a-z。

        for ($i = 0; $i < count($aFiles/2); $i++){
            echo '<tr><td><a>'.$aFiles[$i].'</a><td><td><a>'.$aFiles[$i+13].'</a><td></tr>'
        }
        

        【讨论】:

        • 你不应该在你的计算中使用常量13,替换成从count($aFiles)派生的东西。
        • $aFiles[$i+13] ?你想达到什么目标?
        猜你喜欢
        • 1970-01-01
        • 2016-04-10
        • 2013-02-10
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 2019-01-25
        相关资源
        最近更新 更多