2010-06-14 44 views
2

有一個網頁,主要是IE用戶查看,所以CSS3是不可能的。需要按照字母順序打印5列表,垂直

我希望它列出,如:

A D G 
B E H 
C F I 

這裏是目前列出的功能等:

A B C 
D E F 
G H I 

function listPhoneExtensions($group,$group_title) { 
    $adldap = new adLDAP(); 
    $group_membership = $adldap->group_members(strtoupper($group),FALSE); 

    sort($group_membership); 
    print " 
    <a name=\"".strtolower($group_title)."\"></a> 
    <h2>".$group_title."</h2> 
    <ul class=\"phone-extensions\">"; 
    foreach ($group_membership as $i => $username) { 
     $userinfo = $adldap->user_info($username, array("givenname","sn","telephonenumber")); 
     $displayname = "<span class=\"name\">".substr($userinfo[0]["sn"][0],0,9).", ".substr($userinfo[0]["givenname"][0],0,9)."</span><span class=\"ext\">".$userinfo[0]["telephonenumber"][0]."</span>"; 
     if($userinfo[0]["sn"][0] != "" && $userinfo[0]["givenname"][0] != "" && $userinfo[0]["telephonenumber"][0] != "") { 
     print "<li>".$displayname."</li>"; 
     } 
    } 
    print "</ul><p class=\"clear-both\"><a href=\"#top\" class=\"link-to-top\">&uarr; top</a></p>"; 
} 

實例呈現的HTML:

<ul class="phone-extensions"> 
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li> 
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li> 
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li> 
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li> 
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li> 
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li> 
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li> 
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li> 
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li> 
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li> 
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li> 
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li> 
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li> 
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li> 
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li> 
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li> 
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li> 
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li> 
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li> 
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li> 
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li> 
</ul> 

任何幫助表示讚賞讓它垂直列出alpha。

回答

3

我會將關鍵數據加載到一個數組中,以便您可以對它們進行計數並按照您想要的順序逐步完成。然後使用這樣的算法,讓他們在正確的順序:

$items = BuildItemArray(); // Get the values into an array. 
$columnCount = 5; 
$itemCount = count($items); 

$rowCount = ceil($itemCount/$columnCount); 
for ($i = 0; $i < $rowCount * $columnCount; $i++) 
{ 
    $index = ($i % $columnCount) * $rowCount + floor($i/$columnCount); 
    if ($index < $itemCount) 
    { 
     DisplayItem($items[$index]); 
    } 
    else 
    { 
     DisplayBlank(); 
    } 
} 

我認爲這應該工作,但我沒有測試過它。

+0

幾乎所有的工作,似乎是每一列的結束,它把這個項目,並把它們放在每一行的底部,你會看到這裏:http://cl.ly/b68cc9ed4dced85a0d77 - 我指的是咖喱,梅齊克和弗里德里希。 這是一個ul列表,將每個li左移20%的寬度 – Brad 2010-06-15 14:22:54

+1

對不起,@Brad,我沒有正確處理結束條件。我已經更新了代碼,並且您必須想出一些方法來顯示最後一列底部的空白條目。 – 2010-06-15 17:44:48

0

標題狀態5列,但你的例子顯示3.我假設3

存儲在數組數據,以及對它們進行排序後,請執行下列操作:

對於3列,你想要在同一行上的位置0,3,6。下一行將增加1個這些值中的每一個。所以,1,4,7。下一行將是2,5,8。

因此,您可以更改您的for循環以保存3個值。 0,3,6,然後逐個增加,然後創建下一行。

0

這是什麼爲我工作。請注意,根據行標記(/ /添加行)上的行發現後,列將根據rowCount進行重置。你可以看到我使用screenWidth和itemWidth來計算我的列數。

當空項目的數量大於行數時會發生問題。如果我有8列和17條記錄,我會得到3行(上限(17/8)= 3)。這是一個問題(3 * 8) - 17 = 7個空記錄。這是發生了什麼:

RECORD RECORD RECORD RECORD RECORD RECORD ------ ------ 
RECORD RECORD RECORD RECORD RECORD RECORD ------ ------ 
RECORD RECORD RECORD RECORD RECORD ------ ------ ------ 

由於行是3,那麼的代碼,我添加修復東西線:

columnCount = Math.Ceiling(itemCount/rowCount); 

信息columnCount =三分之一十七天花板= 6(列),所以我的佈局呈現如下所示(我的客戶工作的寬度)。

RECORD RECORD RECORD RECORD RECORD RECORD 
RECORD RECORD RECORD RECORD RECORD RECORD 
RECORD RECORD RECORD RECORD RECORD ------ 

希望能幫助任何遇到我的問題的人。

private List<CompanyCourseViewModel> Reorder(List<CompanyCourseViewModel> courses, Decimal width, Decimal itemWidth) 
    { 
     var list = new List<CompanyCourseViewModel>(); 
     var columnCount = Math.Floor(width/itemWidth); 
     var itemCount = courses.Count(); 
     var rowCount = Math.Ceiling(itemCount/columnCount); 
     columnCount = Math.Ceiling(itemCount/rowCount); // Added line. 

     for (var i = 0; i < rowCount * columnCount; i++) 
     { 
      var index = (int) ((i%columnCount) * rowCount + Math.Floor(i/columnCount)); 
      if (index < itemCount) 
      { 
       courses[index].NumColumns = (int) columnCount; 
       list.Add(courses[index]); 
      } 
      else 
      { 
       list.Add(new CompanyCourseViewModel() 
       { 
        Id = -Math.Abs(i - courses.Count()), 
        Title = "----", 
        NumColumns = (int)columnCount 
       }); 
      } 
     } 

     return list; 
    } 
1

我張貼我的答案,原因如下這個老問題:

  1. 我的回答是更普遍,容易讓別人適應。
  2. 我不想要一個過於複雜的解決方案。
  3. 我的數組是關聯的,並帶有一個字符串鍵。順便說一句,我的解決方案將適用於關聯和索引數組。

其實,我想出的解決方案非常簡單 - 在一個巨大的表格內部使用帶有style =「float:left」的多個標籤。雖然我懷疑在一個表中有多個tbody標籤會通過HTML驗證,但事實上它沒有錯誤地通過。

注意以下

  • $數numCols是你想要的列數。
  • 由於我們是浮動項目,您可能需要設置父元素的寬度和最小寬度和/或根據您的情況添加一些< br style =「clear:both」/ >。
  • 替代排序方法,請參閱http://php.net/manual/en/array.sorting.php

這裏是我完整的答案:

function sortVertically($data = array()) 
{ 
    /* PREPARE data for printing */ 
    ksort($data);  // Sort array by key. 
    $numCols = 5; // Desired number of columns 
    $numCells = is_array($data) ? count($data) : 1 ; 
    $numRows = ceil($numCells/$numCols); 
    $extraCells = $numCells % $numCols; // Store num of tbody's with extra cell 
    $i   = 0; // iterator 
    $cCell  = 0; // num of Cells printed 
    $output  = NULL; // initialize 


    /* START table printing */ 
    $output  .= '<div>'; 
    $output  .= '<table>'; 

    foreach($data as $key => $value) 
    { 
     if($i % $numRows === 0) // Start a new tbody 
     { 
      if($i !== 0)   // Close prev tbody 
      { 
       $extraCells--; 
       if ($extraCells === 0) 
       { 
        $numRows--;  // No more tbody's with an extra cell 
        $extraCells--; // Avoid re-reducing numRows 
       } 
       $output .= '</tbody>'; 
      } 

      $output .= '<tbody style="float: left;">'; 
      $i = 0;     // Reset iterator to 0 
     } 
     $output .= '<tr>'; 
      $output .= '<th>'.$key.'</th>'; 
      $output .= '<td>'.$value.'</td>'; 
     $output .= '</tr>'; 

     $cCell++;     // increase cells printed count 
     if($cCell == $numCells){ // last cell, close tbody 
      $output .= '</tbody>'; 
     } 

     $i++; 
    } 

    /* FINISH table printing */ 
    $output .= '</table>'; 
    $output .= '</div>'; 
    return $output; 
} 

我希望這個答案對你有用的一天。