2010-03-23 87 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; ?>