2010-03-23 54 views
0

我目前有一个列表(<ul>)我已经分成两列的人。但在完成代码后,我想知道是否有更有效或干净的方法来做同样的事情。使用模数的清洁方式列

echo "<table class='area_list'><tr>"; 
// Loop users within areas, divided up in 2 columns 
$count = count($areaArray); 
for($i=0 ; $i<$count ; $i++) { 
    $uid = $areaArray[$i]; 
    // get the modulus value + ceil for uneven numbers 
    $rowCalc = ($i+1) % ceil($count/2); 

    if ($rowCalc == 1) echo "<td><ul>"; 

    // OUTPUT the actual list item 
    echo "<li>{$users[$uid]->profile_lastname}</li>"; 

    if ($rowCalc == 0 && $i!=0) echo "</ul></td>"; 
} 
echo "</tr></table>"; 
+0

对不起鸡蛋里挑骨头,但你错过了您的交易tr标签 –

+0

哈哈!一点也不。谢谢:) – JeroenEijkhof

回答

1

您可以循环两次,每个列一次。从第一列的0开始,第二列的1开始。增加2。

编辑:为了使它更漂亮,把自己列在一个循环:

$cols = 3; 

echo '<table><tr>'; 

// column loop 
for ($c = 1; $c <= $cols; $c++) { 
    echo '<td><ul>'; 

    // item loop 
    for ($i = 0; $i < count($areaArray); $i += $c) { 
    echo '<li>...</li>'; 
    } 

    echo '</ul></td>'; 
} 

echo '</tr></table>'; 
+0

这是实现它的直接方式,我希望能够改变列数。 – JeroenEijkhof

+0

你可以把整个东西包装在一个双循环中 - 一个用于写出列,另一个用于写出项目的内部循环。 –

4

不知道这是否是什么@llia意思,但什么有像这样的循环:

//declare how many columns are needed 
$cols=2; 

//iterate over each row of entries (down the column) 
for ($i=0;i<$count;i+=cols){ 

    echo "<td><ul>"; 

    //entry loop (across the row) 
    for($j=0;j<$cols;j++){ 

      //whose line is it anyway? 
      $uid = $areaArray[$i+$j]; 

      echo "<li>{$users[$uid]->profile_lastname}</li>"; 
    } 
    //end entry loop 

    echo "</ul></td>"; 
} 
//end row loop 

那样,你可以设置你喜欢的任意多列。

原谅我,如果我错过了一些东西,因为我在等着水壶煮沸,以获得我所需要的咖啡!

+0

谢谢你。由于我有一个'$ areaArray'数组来迭代(在上面的代码片段中留下了它,所以这是我的错误),所以它并不完美。所以我不能在我的for循环中迭代数组本身的for循环。这就是为什么我检查每一个'$我' – JeroenEijkhof

+0

它给了我不同的观点,但工作,谢谢! – JeroenEijkhof

+0

完全没有看到'$ uid'作业!但我会编辑它以显示您可以放置​​的位置。 – Bolster

1

这应该做你想做的。我几乎只是结合了其他两个答案,所以每个人都+1。

$cols=3; 
$user_count = count($users); 

echo "<table class='area_list'><tr>"; 

// Column loop 
for($i=0;$i<$cols;$i++){ 
    echo "<td><ul>"; 

    // user loop 
    for($j=$i;$j<$user_count;$j+=$cols){ 
     echo "<li>{$users[$j]->profile_lastname}</li>"; 
    } 
    echo "</ul></td>"; 
} 
echo "</tr></table>";
+0

实际上这不会工作,因为'$ j + = $ cols'使它每次都跳转'3'。它仍然没有考虑到整个用户阵列。它必须在内部for循环中相乘,其中'$ j'首先被设置为'=($ count/2)* $ cols',实际上该计数器在正确的位置开始工作。谢谢你的努力,因为这实际上让我有了一种新的方式来做到这一点,只要我做出我刚刚指定的更改。谢谢! +1 – JeroenEijkhof

+1

输出所有用户。它应该每次跳3次,因为我已经设置了3列 - 你想能够指定多少列,对吧?每次用户循环启动时,它从0开始,然后是1,然后是2.因此,第一次循环它会对用户0,3,6,9,12,15进行循环。下一个循环会为用户1,4,7,10,13提供用户循环。 ..下一个循环,它确实2,5,8,11等... 但无论如何,我很高兴这是有帮助的。 –

1
$cols = 3; 
$chunkSize = ceil(count($areaArray)/$cols); 
echo $chunkSize * $cols; 
foreach (array_chunk($areaArray, $chunkSize) as $items) : ?> 
<td> 
    <ul> 
<?php foreach ($items as $item) : ?> 
    <li><?php echo $item ?></li> 
<?php endforeach; ?> 
    </ul> 
</td> 
<?php endforeach; ?>