如果我有一个多维数组,我想在其中进行组合怎么办?例如,如果我有 3 个数组:
然后我想要一个可以进行组合的函数,例如: array( array(1,7) array(1,3) array( 3,9) 等等,还有 array(7,3) array(7,9)
另外,它必须检查可用性,因此如果号码不可用,则不要与它们进行组合。
现在我得到了这个,但我无法进一步得到:
$xCombinations =
Array(
Array(1,2)
Array(7,3)
Array(3,9,8,2)
);
$available = Array([1] => 2,[2] => 1, [7]=>3,[3]=>4, [8]=>2, [2]=>4);
$combination = Array();
recursiveArray($xCombinations);
function recursiveArray($tmpArr){
if($tmpArr){
foreach ($tmpArr)as $value) {
if (is_array($value)) {
displayArrayRecursively($value);
} else {
//here 1st time $value would be 1,
//so this must now be combined with 7 , 3 , 9, 8 ,2 >
//so you will get an array of array(1,7) array, (1,3) array (3,9)
//etcetera.. there arrays must be also in a multidimensional array
}
}
}
}
本期由两部分组成。实际上,它可以用一个功能块来实现,但这会很难阅读。因此,我将其分为两个操作。
检索组合
第一个任务是获得所有组合。根据定义,这些组合是数组成员的“笛卡尔积”。这可以在没有递归的情况下生成,例如:
$result = array_reduce(array_slice($input, 1), function($c, $x)
{
return call_user_func_array('array_merge',
array_map(function($y) use ($c)
{
return array_map(function($z) use ($y)
{
return array_merge((array)$z, (array)$y);
}, $c);
}, $x)
);
}, current($input));
在这里,我们将元组一一累积起来。结果只是所有可能的组合,因为它应该是笛卡尔积。筛选结果
这是问题的另一部分。假设您有
$available
作为一组
key=>value
对,其中 key
对应于元组中的特定数字,而 value
对应于该数字最多可以在该元组中出现多少次,这里是简单的过滤代码: $result = array_filter($result, function($tuple) use ($available)
{
foreach(array_count_values($tuple) as $value=>$count)
{
if(isset($available[$value]) && $available[$value]<$count)
{
return false;
}
}
return true;
});
例如,如果我们有
$input
as
$input = [
[1,3],
[1,6]
];
以及对其的限制
$available = [6=>0, 1=>1];
那么结果就只有
array(1) {
[1]=>
array(2) {
[0]=>
int(3)
[1]=>
int(1)
}
}
因为只有这个元组满足所有要求(所以它没有
6
和
1
在其中出现过一次)