PHP数组组合 - 一对多

时间:2011-10-18 09:14:01

标签: php arrays

很抱歉,如果其他地方存在解决方案,但我找不到解决方案。

我有以下数组:

$data = array(
    array('a', 'b', 'c'),
    array('e', 'f', 'g'),
    array('w', 'x', 'y', 'z'),
);

我正在努力编写一个能够提供如下数组的函数:

a
    e
        w
        x
        y
        z
    f
        w
        x
        y
        z
    g
        w
        x
        y
        z
b
    e
        w
        x
        y
        z
    f
        w
        x
        y
        z
    g
        w
        x
        y
        z
c
    e
        w
        x
        y
        z
    f
        w
        x
        y
        z
    g
        w
        x
        y
        z

这里的主要问题是源数组的数量及其长度始终在变化。因此,函数应该能够处理给它的任何数据。

我试图想出这样的东西:

function testfunc($data){
    $arrayDepth = count($data);
    foreach($data as $key=>$d){
        foreach($d as $e){
            echo $e . "\n";
            if($key < $arrayDepth){
                array_shift($data);
                testfunc($data);
            }
        }
    }
}

我得到的输出是:

a
e
w
x
y
z
f
g
w
x
y
z
b
w
x
y
z
c
e
f
g
w
x
y
z

我被困了将近一天没有适当的解决方案。任何帮助都会很棒!谢谢!

2 个答案:

答案 0 :(得分:1)

Recursion [Wikipedia]是你的朋友:

function product($arrays) {
    if(count($arrays) === 1) {
        return $arrays[0];
    }
    else {
        $result = array();
        foreach($arrays[0] as $value) {
            $result[$value] = product(array_slice($arrays, 1));
        }
        return $result;
    }
}

DEMO

答案 1 :(得分:1)

非递归版本。这应该跑得快!

$result = end($data);

if ($result === false)
{
   return false; // or Array or what makes sense for an empty array.
}

$higherArr = prev($data);

while ($higherArr !== false)
{
   // Set the orignal array to be the one that you built previously.
   $orig = $result;
   $result = array();

   foreach ($higherArr as $higherKey)
   {
      $result[$higherKey] = $orig;
   }

   $higherArr = prev($data);
}

echo 'Finished with: ' . var_export($result, true);