按字母表列出,将具有少量条目的字母分组在一起(PHP或JS)
我正在开发一个Web应用程序,其中包含很长的名称列表。客户最初希望将名称按字母拆分为按字母表列出,将具有少量条目的字母分组在一起(PHP或JS),php,javascript,html-lists,alphabetical,Php,Javascript,Html Lists,Alphabetical,我正在开发一个Web应用程序,其中包含很长的名称列表。客户最初希望将名称按字母拆分为divs,以便很容易跳转到列表上的特定名称 现在,查看列表,客户指出了几个只有一两个名字的字母。他现在想知道,如果每个字母中只有几个名字,我们是否可以组合几个连续的字母 (请注意,根本不显示没有名称的字母。) 我现在要做的是让数据库服务器返回一个排序列表,然后保留一个包含当前字符的变量。我浏览了一下姓名列表,递增字符,并在到达每个字母时打印开头和结尾的div和ul标签。我知道如何调整这个代码来组合一些字母,但是,
div
s,以便很容易跳转到列表上的特定名称
现在,查看列表,客户指出了几个只有一两个名字的字母。他现在想知道,如果每个字母中只有几个名字,我们是否可以组合几个连续的字母
(请注意,根本不显示没有名称的字母。)
我现在要做的是让数据库服务器返回一个排序列表,然后保留一个包含当前字符的变量。我浏览了一下姓名列表,递增字符,并在到达每个字母时打印开头和结尾的div
和ul
标签。我知道如何调整这个代码来组合一些字母,但是,我不确定如何处理的一件事是,一个特定的字母组合是否是最好的组合。换句话说,假设我有:
-12个名称A
-2个名称B
-1名称C
-1名称D
-1名称E
-23姓名F
a-C
结束,然后自己拥有D
。我要寻找的是一种有效的方法,来认识到A
应该是单独的,然后B-D
应该在一起
我真的不知道从哪里开始看这个
如果有什么不同,那么这段代码将在Kohana框架模块中使用
更新2012-04-04: 以下是我需要的澄清: 假设一组中我想要的最小项目数是30。现在假设字母A有25项,字母B、C和D各有10项,字母E有32项。我不想打扰A,因为B+C+D组合会更好。组合它们的简单方法是A+B,C+D+E——这不是我想要的 换句话说,我需要最接近每组最小值的最佳拟合。使用JSFIDLE put,我想出了一些可行的方法:
显然,如果要将其用作伪代码,可以应用一些技术来提高其效率。如果一个字母包含10个以上的名字,或者你设定的任何合理限制,不要将它与下一个字母组合在一起。然而,如果你开始组合字母,你可以让它运行,直到收集到15个左右的名字,如果你愿意的话,只要每个字母都不超过10个。这不是一个通用的解决方案,但我就是这样解决的。我使用PHP设计了这个函数。 它将包含超过$amount名称的字母组合在一起
function split_by_initials($names,$ammount,$tollerance = 0) {
$total = count($names);
foreach($names as $name) {
$filtered[$name[0]][] = $name;
}
$count = 0;
$key = '';
$temp = array();
foreach ($filtered as $initial => $split) {
$count += count($split);
$temp = array_merge($split,$temp);
$key .= $initial.'-';
if ($count >= $ammount || $count >= $ammount - $tollerance) {
$result[$key] = $temp;
$count = 0;
$key = '';
$temp = array();
}
}
return $result;
}
第三个参数用于将组限制为未指定amount但足够接近的单个字母
差不多
我想分成30人一组
但是a有25个
为此,如果将Tolerance设置为5,则a将被保留,其他字母将被分组
我忘了提到,但它返回一个多维数组,其中包含的字母作为键,然后是包含的名称。
差不多
Array
(
[A-B-C-] => Array
(
[0] => Bandice Bergen
[1] => Arey Lowell
[2] => Carmen Miranda
)
)
排列
(
[A-B-C-]=>阵列
(
[0]=>Bandice Bergen
[1] =>Arey Lowell
[2] =>卡门·米兰达
)
)
这并不完全是您所需要的,但我认为它已经足够接近了。Javascrip版本:带有排序和符号分组的增强版
function group_by_initials(names,ammount,tollerance) {
tolerance=tollerance||0;
total = names.length;
var filtered={}
var result={};
$.each(names,function(key,value){
val=value.trim();
var pattern = /[a-zA-Z0-9&_\.-]/
if(val[0].match(pattern)) {
intial=val[0];
}
else
{
intial='sym';
}
if(!(intial in filtered))
filtered[intial]=[];
filtered[intial].push(val);
})
var count = 0;
var key = '';
var temp = [];
$.each(Object.keys(filtered).sort(),function(ky,value){
count += filtered[value].length;
temp = temp.concat(filtered[value])
key += value+'-';
if (count >= ammount || count >= ammount - tollerance) {
key = key.substring(0, key.length - 1);
result[key] = temp;
count = 0;
key = '';
temp = [];
}
})
return result;
}
如果人们想用js方法进行一些测试,这里有一个名称起始列表。我知道这可以通过一些大型的动态编程来实现,但我希望有人能找到一些简单到可以在Web应用程序中使用的东西。如果我需要使用动态编程,我将不得不偶尔运行它并缓存结果,因为在页面加载时运行它会过于密集。这不是我想要的。我已经有了可以这样分解它们的代码,如果这个组小于最小值,只需添加下一个组。请参阅我的问题更新。这可能就是我最终要做的。不幸的是,这不是我所希望的。