1

也许我有一个愚蠢的时刻,但我似乎无法在我的脑海中解决这个问题。

我会尝试解释:-

我有三套。每组包含 6 个对象。我需要一个循环(或一系列嵌套循环)来产生这些集合的每个组合。

这是一个游戏,我正在尝试编写一个脚本来比较盔甲套装 - 我知道很伤心。集合数组如下所示:-

class => array(
  set1 => array(
    hat item => array(stats)
    glove item => array(stats)
    ...
  set2 => array(
    hat item => array(stats)
    ...
  set3 => array(
    ...

)

这可能比我想象的要简单得多(或者困难得多?)。

欢迎提出想法!

谢谢,鲁。

编辑:-

好的,这是一个数组样本,我去掉了很多额外的统计数据,只为每一块留下一个:-

$setinfo = array(
    'rk' => array(
        'set1' => array(
            'hat' => array(
                'will' => 114,
            ),
            'shoulders' => array(
                'will' => 78,
            ),
            'shirt' => array(
                'will' => 78,
            ),
            'gloves' => array(
                'will' => 78,
            ),
            'trousers' => array(
                'will' => 78,
            ),
            'boots' => array(
                'will' => 114,
            ),
        ),
        'set2' => array(
            'hat' => array(
                'will' => 78,
            ),
            'shoulders' => array(
                'will' => 78,
            ),
            'shirt' => array(
                'will' => 114,
            ),
            'gloves' => array(
                'will' => 78,
            ),
            'trousers' => array(
                'will' => 114,
            ),
            'boots' => array(
                'will' => 78,
            ),
        ),
        'set3' => array(
            'hat' => array(
                'will' => 78,
            ),
            'shoulders' => array(
                'will' => 114,
            ),
            'shirt' => array(
                'will' => 78,
            ),
            'gloves' => array(
                'will' => 114,
            ),
            'trousers' => array(
                'will' => 78,
            ),
            'boots' => array(
                'will' => 78,
            ),
        ),
    )
);

从这个例子中(稍后我会担心比较其他统计数据),“理想”的单品是 set1 的帽子和靴子,set2 的衬衫和裤子,以及 set3 的手套和肩膀。

我的查询是如何最好地制定一个循环,该循环可以为每个排列生成一个“结果”数组,以便稍后进行比较。

4

1 回答 1

2

这是这个人的一个实现:

function array_cartesian_product($arrays)

{
    $result = array();
    $arrays = array_values($arrays);
    $sizeIn = sizeof($arrays);
    $size = $sizeIn > 0 ? 1 : 0;
    foreach ($arrays as $array)
        $size = $size * sizeof($array);
    for ($i = 0; $i < $size; $i ++)
    {
        $result[$i] = array();
        for ($j = 0; $j < $sizeIn; $j ++)
            array_push($result[$i], current($arrays[$j]));
        for ($j = ($sizeIn -1); $j >= 0; $j --)
        {
            if (next($arrays[$j]))
                break;
            elseif (isset ($arrays[$j]))
                reset($arrays[$j]);
        }
    }
    return $result;
}
$combinations = array_cartesian_product($sets);

这是一个简单的测试用例: http: //phpfiddle.org/main/code/m1i-w7m

于 2012-10-24T09:44:32.690 回答