我想生成所有可能的数组元素组合来填充占位符,占位符大小可能会有所不同。
假设我有数组$a = array(3, 2, 9, 7)
,占位符大小为6
。我想生成如下内容:
3,3,3,3,3,3
2,3,3,3,3,3
2,2,3,3,3,3
...........
...........
7,7,7,7,7,9
7,7,7,7,7,7
然而,(2,3,3,3,3,3)
将被视为与(3,2,3,3,3,3)
相同,因此后者不会计算在内。
有人能指出我正确的方向吗?我知道有Math_Combinatorics
pear
个包,但该包只适用于占位符大小<= count($a)
。
修改 我认为这个类似于位串组合,但具有不同的数字基础
答案 0 :(得分:1)
我没有适合您的PHP源代码,但有些资源可能有用。
一些C代码。看看2.1: http://www.aconnect.de/friends/editions/computer/combinatoricode_g.html
Delphi代码:combination without repetition of N elements without use for..to..do
维基文章here
答案 1 :(得分:0)
好吧,花了一些时间来解决这个问题。
所以我将问题分成多个部分
1。 我在firsrt制作了一个包含所有可能值选项的数组。
function create_all_array($placeholder, array $values)
{
if ($placeholder <= 0) {
return [];
}
$stack = [];
$values = array_unique($values);
foreach ($values as $value) {
$stack[] = [
'first' => $value,
'childs' => create_all_array($placeholder - 1, $values)
];
}
return $stack;
}
2。 然后我创建了一个函数来将大量数据转换为字符串(不检查唯一身份)。
function string($values, $prefix = '')
{
$stack = [];
foreach($values as $value) {
$sub_prefix = $prefix . $value['first'];
if (empty($value['childs'])) {
$stack[$sub_prefix] = (int)$sub_prefix;
} else {
$stack = array_merge($stack, string($value['childs'], $sub_prefix));
}
}
return $stack;
}
3。 然后艰难的部分来了。检查重复项。这比预期的要困难,but found some good anser to it and refactored it for my use。
function has_duplicate($string, $items)
{
$explode = str_split ($string);
foreach($items as $item) {
$item_explode = str_split($item);
sort($explode);
$string = implode('',$explode);
sort($item_explode);
$item = implode($item_explode);
if ($string == $item) {
return true;
}
}
return false;
}
4。 最后一步是将英特尔组合成一个新的功能:P
function unique_string($placeholder, array $values)
{
$stack = string(create_all_array($placeholder, $values));
$check_stack = [];
foreach($stack as $key => $item) {
if (has_duplicate($item, $check_stack)) {
unset($stack[$key]);
}
$check_stack[] = $item;
}
return $stack;
}
现在你可以简单地使用它了
unique_string(3 /* amount of dept */, [1,2,3] /* keys */);
Ps代码基于PHP5.4 +,要转换为较低,您需要将[]
更改为array()
,但我喜欢新语法,很抱歉:P