数组元素的PHP组合
Posted
技术标签:
【中文标题】数组元素的PHP组合【英文标题】:PHP combinations of array elements 【发布时间】:2013-05-15 22:05:15 【问题描述】:我想生成所有可能的数组元素组合来填充占位符,占位符的大小可能会有所不同。
假设我有数组$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)
。
编辑 我在想这个类似于位串组合,尽管具有不同的数字基数
【问题讨论】:
这不太合乎逻辑,因为有些组合是任意的。这将取决于前面的组合来确定一个新的组合是否合法。虽然仍然可行。 如果placeholder < count($a)
怎么办?
抱歉,想回答一下。从错误的领域开始。
@OfirBaruch:我知道是这样。确实会花费太多时间。不会给出答案。抱歉,没有那么多时间。
@nl-x 因为有时占位符可能大于count($a)
【参考方案1】:
我没有给你的 php 源代码,但有一些资源可能会有所帮助。
一些 C 代码。看2.1: http://www.aconnect.de/friends/editions/computer/combinatoricode_g.html
德尔福代码:combination without repetition of N elements without use for..to..do
维基文章here
【讨论】:
【参考方案2】:好吧,我花了一些时间才弄清楚这一点。
所以我把问题分成多个部分
1。 我首先创建了一个包含所有可能值选项的数组。
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。 最后一步是将intel组合成一个新的功能: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
【讨论】:
以上是关于数组元素的PHP组合的主要内容,如果未能解决你的问题,请参考以下文章