PHP数组 - 3个数组中的独特组合

时间:2018-04-20 11:51:00

标签: php arrays unique combinations nested-loops

我甚至不确定如何处理这个问题所以我只是说明问题。任何帮助都非常感谢。

所有可能的值都有这个数组($ colors):

$colors = array ('red','blue','green','yellow');

然后是一个包含所有可能值的数组($ boxes) - 包含与$ colors相同数量的值:

$boxes = array ('circular','squared','hexagonal','triangular');

第三个数组定义了制作唯一组合的约束条件:

$possible_combos = array  
(  
array('circular','red','blue'),  
array('squared','red','green'),
array('hexagonal','blue','yellow'),
array('triangular','red','green')
);

问题:如何使用key =>值组合获得新的数组$结果,只是为每个框分配了一个独特的颜色,其中可能的颜色组

因此有效的$ result数组将是:

Array ( [circular] => red 
        [squared]  => blue 
        [hexagonal]=> yellow
        [triangular] => green
      ) 

注意:如果你顺序遍历,“红色”,“蓝色”,“绿色”可能被分配到前三个“盒子”,并且可能没有任何东西可以选择第四个盒子(因为'黄色'是不允许的分配给它。
我在想,首先处理最少发生的“颜色”,但实际上不确定如何在语法上处理它。

再次感谢您提前查看!即使是一些如何解决问题的帮助也会很好。

以下代码也没有产生正确的输出:

foreach ($colors as $c => $color) {
    foreach ($boxes as $b => $box) {
        for ($i=0; $i < count($colors) ; $i++) {
            if(in_array($possible_combos[$i][1],$colors) && !in_array($possible_combos[$i][1], $result))
            {
                $result[$box] = $possible_combos[$i][1];
                unset($colors[$c]);
                break;
            }
            else if(in_array($possible_combos[$i][2],$colors) && !in_array($possible_combos[$i][2], $result))
            {
                $result[$box] = $possible_combos[$i][2];
                unset($colors[$c]);
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我在思考,处理发生率最低的颜色&#39;首先,但真的不确定如何在语法上处理它。

考虑到你只有一种可以分享多种颜色之一的盒子类型,这是一个很好的直觉。因为您的约束资源是颜色的,我认为首先按照它们对规则进行排序然后您可以通过稀缺来分配它们是有意义的。

https://3v4l.org/u5pBK

$colors = array ('red','blue','green','yellow');

$boxes = array ('circular','squared','hexagonal','triangular');

$possible_combos = array
(
    array('circular','red','blue'),
    array('squared','red','green'),
    array('hexagonal','blue','yellow'),
    array('triangular','red','green')
);

// collect constraints ordered by rarest
foreach ($possible_combos as $constraint) {
    $box = array_shift($constraint);
    foreach ($constraint as $color) {
        $constraints[$color] []= $box;
    }
}

// assign rarest first to last
asort($constraints);
foreach ($constraints as $color => $allowedBoxes) {
    foreach ($allowedBoxes as $box) {
        $key = array_search($box, $boxes);
        // if we have a match, then remove it from the collection
        if ($key !== false) {
            $result[$box] = $color;
            unset($boxes[$key]);
            continue 2;
        }
    }
}

print_r($result);
Array
(
    [hexagonal] => yellow
    [circular] => blue
    [squared] => green
    [triangular] => red
)