将多个数组传递给笛卡尔函数

时间:2014-11-18 23:47:01

标签: php multidimensional-array cartesian-product

我需要将索引格式的多个数组传递给cartesain函数,以便计算每个排列。这在代码为:

时有效
$count = cartesian(
Array("GH20"),
Array(1,3),
Array(6,7,8), 
Array(9,10)
);

我不会总是知道数组的长度,数量或值,因此它们存储在另一个数组“$ total”中,可能看起来像这样:

Array ( 
    [0] =>  Array
            (
            [0] => 1
            [1] => 3
            ) 
    [1] => Array 
            (
            [0] => 6
            [1] => 7 
            [2] => 8
            ) 
    [2] => Array 
            ( 
            [0] => 9 
            [1] => 10 
            ) 
    )

我尝试按照以下方式实现user_call_back_function:

$count = call_user_func('cartesian', array($total));

然而,传递的数组看起来像这样:

Array (
[0] => Array (
    [0] => Array (
        [0] => Array (
            [0] => 1
            [1] => 3
            [2] => 4
        )
            [1] => Array (
            [0] => 5
            [1] => 6
            [2] => 7
            [3] => 8
        )
            [2] => Array (
            [0] => 9
            [1] => 10
        )
        )
    )
)

我哪里出错了,为什么阵列被埋没在不需要的维度中,这就是我的cartesain功能不再起作用的原因?

谢谢,尼克

根据要求,这是我的cartesain功能:

function cartesian() {
$_ = func_get_args();
if(count($_) == 0)
    return array(array());
$a = array_shift($_);
$c = call_user_func_array(__FUNCTION__, $_);
$r = array();
foreach($a as $v)
    foreach($c as $p)
        $r[] = array_merge(array($v), $p);
return $r;
}

1 个答案:

答案 0 :(得分:0)

  

为什么阵列被埋没在不需要的维度中?

只是因为在调用call_user_func时将数组包装在另一个数组中。

$count = call_user_func('cartesian', array($total));

也许你的意思是:

$count = call_user_func('cartesian', $total);
  

这就是我的cartesain功能不再起作用的原因吗?

我不知道,你还没有发布你的cartesain,只是一个名叫cartesain

的arrat

编辑已更新问题。

如果您使用的是PHP 5.6,则应该可以使用splat operator

call_user_func("cartesain", ...$total);

免责声明,我没有对此进行测试。

  

使用...运算符调用函数时,可以将数组和可遍历对象解压缩到参数列表中。