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