这是ColdFusion中的一个似乎应该如此简单的事情......但我找不到简单的道路。
我有一系列的清单。 该数组可以是任何大小,每个列表的长度可以是任何大小。 (这可以被操纵成一个多维数组,无论......重点是,我有一个列表列表)
例如
129128127
130131132
135133134
137138136
140139
141142
或简短的版本......它可以有所不同
13,14,15
11,12
我需要的是数组,查询或其他一些数据结构 包含所有可能的唯一组合,按顺序从每个列表中取一个......所以对于短版本,将有6个独特的组合。对于第一个较长的例子,我们将有3 * 3 * 3 * 3 * 2 * 2 = 324个独特的组合。
计算它们很容易......但是以结构化格式获得实际组合的最佳方法是什么? 一定要错过一些简单的事情......我已经好几个小时了! : - /
答案 0 :(得分:5)
这是我的看法。 积分转到codingforums.com上的帖子中的php函数:http://www.codingforums.com/showpost.php?p=945289&postcount=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#">
答案 1 :(得分:1)
这样的事情应该有效。循环遍历第一个列表中的每个项目,并对列表2和3中的每个项目进行组合,然后检查以确保它不在已知列表中,如果没有,则将其添加到组合列表中。
<cfset list1 = "1,2,3" />
<cfset list2 = "4,5,6" />
<cfset list3 = "7,8,9,1" />
<cfset combinations = [] />
<cfloop list="#list1#" index="i">
<cfif not arrayFind(combinations,i)>
<cfset arrayAppend(combinations,i) />
</cfif>
<cfloop list="#list2#" index="y">
<cfif not arrayFind(combinations,y)>
<cfset arrayAppend(combinations,y) />
</cfif>
<cfif not arrayFind(combinations, "#i#,#y#")>
<cfset arrayAppend(combinations,"#i#,#y#") />
</cfif>
<cfloop list="#list3#" index="z">
<cfif not arrayFind(combinations,z)>
<cfset arrayAppend(combinations,z) />
</cfif>
<cfif not arrayFind(combinations, "#i#,#y#,#z#")>
<cfset arrayAppend(combinations,"#i#,#y#,#z#") />
</cfif>
</cfloop>
</cfloop>
</cfloop>
<cfdump var="#combinations#" />
答案 2 :(得分:0)
好的,所以你需要遍历列表数组。在每次迭代时,您需要针对每个剩余列表遍历该位置的列表。
所以在第一位迭代2 3 4 5 6 在第二位迭代3 4 5 6,依此类推