在PHP中组合2个dim数组元素

时间:2011-09-14 02:33:28

标签: php arrays function recursion

我有一个$数组,我希望将每个第二级元素组合如下:

$array['A'] = array('a','b','c');
$array['B'] = array('d','e','f');
$array['C'] = array('g','h','i');

function combine($array)
{
    $result = array();
    foreach($array['A'] as $a)
        {
        foreach($array['B'] as $b)
        {
            foreach($array['C'] as $c)
            {
                $result[] = array($a,$b,$c);
            }
        }
    }
    return $result;
}

只有当count($ array)为3时,combine()才能正常显示正确的结果。如果我添加更多的$ array元素,例如$ array ['D'] = array('j',' k','l'),然后它无法正常工作。

如何解决此问题?

我想我应该使用递归函数。但我对这种类型的编程没有任何经验。

你能帮帮我吗?这让我很疯狂。

3 个答案:

答案 0 :(得分:1)

啊,好问题。我实际上必须在很多场合重新实现这一点。这应该适合你:

    class Counter {
    private $bases;
    private $currNum;
    private $increment;
    private $maxVal;

    public function __construct($bases) {
        $this->bases = $bases;
        $this->maxVal = 1;
        $this->currNum = array();
        foreach ($bases as $base) {
            $this->maxVal *= $base;
            $this->currNum[] = 0;
        }
        $this->increment = 0;
    }

    public function increment() {
        ++$this->increment;
        for ($i = count($this->currNum) - 1; $i > -1; --$i) {
            $val = $this->currNum[$i] + 1;
            if ($val >= $this->bases[$i]) {
                $this->currNum[$i] = 0;
            } else {
                $this->currNum[$i] = $val;
                return;
            }
        }
    }

    // TODO handle overflows
    public function hasNext() {
        return $this->increment < $this->maxVal;
    }

    public function getNum() {
        return $this->currNum;
    }

    public function getIncrement() {
        return $this->increment;
    }
}

// your sample arrays
$arrays = array(
array('a', 'b', 'c'),
array('d', 'e', 'f'),
array('g', 'h', 'i')
);

// parameter to counter changes based on how many arrays you have
// if you have 4 arrays of len 4, it'll be $counter = new Counter(array(4,4,4,4));
// it'll work with arrays of varying lengths as well.
// so if you have 1 array of len 2, another of len 3 and a third of len 4:
// $counter = new Counter(array(2,3,4));
$counter = new Counter(array(3,3,3));

$result = array();
while ($counter->hasNext()) {
    $indexes = $counter->getNum();
    //print_r($indexes);
    $result[] = array();
    foreach ($indexes as $arr => $index) {
        $result[count($result) - 1][] = $arrays[$arr][$index];
    }
    $counter->increment();
}

print_r($result);
我改变了 $阵列[ 'A'] $阵列[ 'B'] 被索引为 $数组[0] $ array [1]等使其更易于使用。

counter->getNum()

返回数组索引。您可以选择是否要实际选择该元素。

答案 1 :(得分:0)

您可以使用array_map(null, $array['A'], $array['B'], $array['C'], $array['D'])来执行此操作。

array_map可以使用null作为回调来构造数组数组。

答案 2 :(得分:0)

问题是你的函数要求它的参数是一个如下结构的数组:

Array
(
    [A] => Array()
    [B] => Array()
    [C] => Array()
)

我认为添加另一个键'D'实际上并没有破坏功能,你只是没有得到你想要的结果。