0

基本上我已经在我的网站上创建了一个搜索页面,我需要显示每个乐队名称/曲目/位置 AZ。我已经成功地按字母顺序列出了每个乐队,但是我希望页面的一半有 0-9,AL 在它上面,而另一个有 MZ。有没有办法使用 Ascii 检查 + 计数来检查每个波段的第一个字母并将它们调用到正确的字母组?谢谢。

4

2 回答 2

1

听起来您想根据字符串的第一个字母将查询拆分为多个集合。在 CF 10 或 Railo 4 中,您可以使用Underscore.cfc groupBy 函数来完成此操作,如下所示:

_ = new Underscore();

bands_by_name = _.groupBy(bands, function(band) {
   var first_letter = left(band.name, 1);

   if (isNumeric(first_letter))
      return '0-9';
   else if (first_letter <= 'L')
      return 'A-L';
   else
      return 'M-Z';
});

groupBy(collection, callback)遍历一个集合,将回调函数应用于每个项目,并使用返回值将集合项目分组到一个新结构中。

在这种情况下,bands_by_name结构将具有键0-9A-LM-Z,每个键都包含一个包含相关结果的结构数组。例子:

{
   '0-9': [{name: '1 Band', track: 5, location: 'CA'}, {name: '2Cool', track: 1, location: 'NM'}],
   'A-L': [{name: 'Good Band', track: 2, location: 'NY'}],
   'M-Z': [{name: 'Some Band', track: 3, location: 'PA'}, {name: 'What a Band', track: 2, location: 'NV'}]
}

注意:我编写了 Underscore.cfc 库。

于 2012-12-17T10:07:06.973 回答
0

它有点冗长,但它允许通过向 list 添加/更改 ascii 值来快速更改列bandGroups它假设每一列都有数据。

<!--- syntax may very depending on database --->
<cfquery ...>
  Select
      bandName
    , trackName
    , location
    , upper(left(bandName,1)) as firstLetter
  from
    someTable
  order by
    bandName
</cfquery>
<!--- 
  create a list of ascii values used to break up your columns
  this will allow you to easily change the number of columns
  End first group at L , end next group at [ (first char after "Z") 
--->
<cfset bandGroups = asc("M") & ',' & asc("[")>
<cfset thisGroup = 1>
<cfset header = '<div style = "float: left; width: #int(100/listLen(bandGroups))#%"><table>'>
<cfoutput>#header#</cfoutput>
    <cfoutput query = "query" group = "firstLetter">
        <tr>
            <td colspan="3">
              #query.firstLetter# 
            </td>
        </tr>
    <cfoutput>
        <tr>
          <td>#query.bandName#</td>
          <td>#query.trackName#</td>
          <td>#query.location#</td>
        </tr>
    </cfoutput>
    <cfif query.recordCount eq query.currentRow or asc(query.firstLetter) gte listGetAt(bandGroups, thisGroup)>
        <cfset thisGroup++>
        </table>
        </div>
        <cfif query.currentRow neq query.recordCount>
            #header#
        </cfif>
    </cfif>
</cfoutput>
于 2012-12-17T16:51:43.190 回答