用于比较装甲集的复杂阵列

时间:2012-10-24 09:07:56

标签: php arrays jagged-arrays

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

我会尝试解释: -

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

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

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

)

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

欢迎提示!

谢谢, RUU。

编辑: -

好的,这是一个数组样本,我已经删除了很多额外的统计数据,并为每一部分留下了一个: -

$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的手套和肩膀。

我的查询是如何最好地计算一个循环,它可以生成每个排列的'结果'数组,以便稍后进行比较。

1 个答案:

答案 0 :(得分:2)

以下是this guy的实施:

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