Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按字母表列出,将具有少量条目的字母分组在一起(PHP或JS)_Php_Javascript_Html Lists_Alphabetical - Fatal编程技术网

按字母表列出,将具有少量条目的字母分组在一起(PHP或JS)

按字母表列出,将具有少量条目的字母分组在一起(PHP或JS),php,javascript,html-lists,alphabetical,Php,Javascript,Html Lists,Alphabetical,我正在开发一个Web应用程序,其中包含很长的名称列表。客户最初希望将名称按字母拆分为divs,以便很容易跳转到列表上的特定名称 现在,查看列表,客户指出了几个只有一两个名字的字母。他现在想知道,如果每个字母中只有几个名字,我们是否可以组合几个连续的字母 (请注意,根本不显示没有名称的字母。) 我现在要做的是让数据库服务器返回一个排序列表,然后保留一个包含当前字符的变量。我浏览了一下姓名列表,递增字符,并在到达每个字母时打印开头和结尾的div和ul标签。我知道如何调整这个代码来组合一些字母,但是,

我正在开发一个Web应用程序,其中包含很长的名称列表。客户最初希望将名称按字母拆分为
div
s,以便很容易跳转到列表上的特定名称

现在,查看列表,客户指出了几个只有一两个名字的字母。他现在想知道,如果每个字母中只有几个名字,我们是否可以组合几个连续的字母

(请注意,根本不显示没有名称的字母。)

我现在要做的是让数据库服务器返回一个排序列表,然后保留一个包含当前字符的变量。我浏览了一下姓名列表,递增字符,并在到达每个字母时打印开头和结尾的
div
ul
标签。我知道如何调整这个代码来组合一些字母,但是,我不确定如何处理的一件事是,一个特定的字母组合是否是最好的组合。换句话说,假设我有:

  • A
    -12个名称
  • B
    -2个名称
  • C
    -1名称
  • D
    -1名称
  • E
    -1名称
  • F
    -23姓名
我知道如何以一组
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应用程序中使用的东西。如果我需要使用动态编程,我将不得不偶尔运行它并缓存结果,因为在页面加载时运行它会过于密集。这不是我想要的。我已经有了可以这样分解它们的代码,如果这个组小于最小值,只需添加下一个组。请参阅我的问题更新。这可能就是我最终要做的。不幸的是,这不是我所希望的。