生成矩阵的所有组合

时间:2015-11-27 09:16:12

标签: php

我正在使用此代码生成矩阵中的所有组合 但它没有返回输出。你能救我吗?

function combos($data, $all = array(), $group = array(), $val = null,$i=0) {
    if (isset($val)) {
        array_push($group, $val);
    }
    if ($i >= count($data)) {
        array_push($all, $group);
    } else {
        foreach ($data[$i] as $v) {
            combos($data, &$all, $group, $v, $i + 1);
        }
    }
    return $all;
}
$data = array(
    array('a', 'b'),
    array('d', 'e', 'g'),
    array('w', 'x', 'y', 'z')
);
$combos = combos($data);
print_r($combos);

输出应为

            0 1 2
array[0]  = a d w
array[1]  = a d x
array[2]  = a d y
array[3]  = a d z
array[4]  = a e w
array[5]  = a e x
array[6]  = a e y
.
.
.
array[23] = b g z

3 个答案:

答案 0 :(得分:0)

$all循环中将value and not as reference作为foreach传递。您也没有在combos循环中收集foreach函数的返回值。

修改 combos($data, &$all, $group, $v, $i + 1);
$all = combos($data, $all, $group, $v, $i + 1);

答案 1 :(得分:0)

从递归combo函数调用中捕获返回值,并从递归函数调用中删除引用&$all的传递。

<?php
function combos($data, $all = array(), $group = array(), $val = null, $i = 0)
{
    if (isset($val)) {
        array_push($group, $val);
    }

    if ($i >= count($data)) {
        array_push($all, $group);
    } else {
        foreach ($data[$i] as $v) {
            $all = combos($data, $all, $group, $v, $i + 1);
        }
    }
    return $all;
}

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

$combos = combos($data);

print_r($combos);

?>

工作示例link

答案 2 :(得分:0)

与@PerakSola和@Samir一样,您可以收集combos值的返回值,或者您可以通过引用传递$all变量。要以正确的方式执行此操作,请使用以下代码:

function combos($data, &$all = array(), $group = array(), $val = null, $i = 0)
{
    if (isset($val)) {
        array_push($group, $val);
    }

    if ($i >= count($data)) {
        array_push($all, $group);
    } else {
        foreach ($data[$i] as $v) {
            combos($data, $all, $group, $v, $i + 1);
        }
    }
    return $all;
}

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

$combos = combos($data);

print_r($combos);