从ColdFusion中的多个列表中获取所有可能的唯一值组合

m_e*_*sta 2 arrays coldfusion list

这是ColdFusion中的一个似乎应该如此简单的事情......但我找不到简单的道路.

我有一系列的清单.该数组可以是任何大小,每个列表的长度可以是任何大小.(这可以被操纵成一个多维数组,无论......重点是,我有一个列表列表)

例如

  1. 129128127

  2. 130131132

  3. 135133134

  4. 137138136

  5. 140139

  6. 141,142

或者简短的版本......它可以变化

  1. 13,14,15

  2. 11,12

我需要的是一个数组,查询或一些其他数据结构,包含所有可能的唯一组合,从每个列表中按顺序取一个...所以对于短版本,将有6个独特的组合.对于第一个较长的例子,我们将有3*3*3*3*2*2 = 324个独特的组合.

计算它们很容易......但是以结构化格式获得实际组合的最佳方法是什么?一定要错过一些简单的事情......我已经好几个小时了!: - /

aza*_*aza 5

这是我的看法.感谢您在codingforums.com上的这篇文章中的php函数:http://www.codingforums.com/showpost.php? p = 945289&posttcount = 3 我刚想到如何在cfml中重写它.

<cfscript>
public array function array_cartesian_product(_arrays=[]) {
    var result = [];
    var _arrayslen = arraylen(arguments._arrays);
    var _size = (_arrayslen) ? 1 : 0;
    var _array = '';
    var x = 0;
    var i = 0;
    var j = 0;
    var _current = [];

    for (x=1; x lte _arrayslen; x++) {
        _size = _size * arraylen(arguments._arrays[x]);
        _current[x] = 1;
    }

    for (i=1; i lte _size; i++) {
        result[i] = [];

        for (j=1; j lte _arrayslen; j++) {
            arrayappend(result[i], arguments._arrays[j][_current[j]]);
        }

        for (j=_arrayslen; j gt 0; j--) {
            if (arraylen(arguments._arrays[j]) gt _current[j])  {
                _current[j]++;
                break;
            }
            else {
                _current[j] = 1;
            }
        }

    }

    return result;
}
</cfscript>
<cfset arrays = [[129,128,127],[130,131,132],[135,133,134],[137,138,136],[140,139],[141,142]]>
<cfset r = array_cartesian_product(arrays)>
<cfoutput>#arraylen(r)#</cfoutput>
<cfdump var="#r#">
Run Code Online (Sandbox Code Playgroud)