php 多数组

问题描述 投票:0回答:1

如果我有一个多维数组,我想在其中进行组合怎么办?例如,如果我有 3 个数组:

  • 数组(1,2)
  • 数组(7,3)
  • 数组(3,9,8,2)

然后我想要一个可以进行组合的函数,例如: 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
                   }
                 }
               }
            }
php arrays combinations cartesian-product
1个回答
1
投票

本期由两部分组成。实际上,它可以用一个功能块来实现,但这会很难阅读。因此,我将其分为两个操作。

检索组合

第一个任务是获得所有组合。根据定义,这些组合是数组成员的“笛卡尔积”。这可以在没有递归的情况下生成,例如: $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
在其中出现过一次)
    

© www.soinside.com 2019 - 2024. All rights reserved.