PHP计算二维数组的每个排列

Posted

技术标签:

【中文标题】PHP计算二维数组的每个排列【英文标题】:PHP Calculate Every Permutation from 2D Array 【发布时间】:2015-01-15 00:28:52 【问题描述】:

几天来,我一直在寻找和挠头,我被困在一块石头和一个坚硬的地方之间。在我之前的所有代码运行之后,我只剩下这个数组:

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

我需要做的是计算所有键的所有可能排列。

所需的输出需要可以作为单个记录轻松插入,或者最好是批量插入到 sql 数据库中。

在我四处寻找之后,我尝试了无数的例子。我得到的最接近的是使用 Implode 函数,但这仍然不起作用。

非常感谢任何帮助!

--编辑--

这是返回数组的外观示例:

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

这不是所有排列,但应该让您了解我需要实现的目标。

【问题讨论】:

您要切换尺寸吗?我的意思是第三维的值可以用在第一个等等? @Cheery 让这段代码正常工作对我来说更重要。我可以根据返回的输出格式将插入重新写入数据库。谢谢 【参考方案1】:

您要执行的操作在以下公式中定义:

它可能会这样做,它被称为笛卡尔积:

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;


$count = cartesian(
    Array(1,3),
    Array(6,7,8), 
    Array(9,10)
);

print_r($count);

【讨论】:

太不可思议了!谢谢!最后一个问题,是否可以在 "$count = printer(" If my original array = "$total" 我可以使用.. "$count = printer($total);" 中使用动态数组 我可以将我的数组转换为您使用的索引数组,但是我可能有多个数组。这需要是动态的。我尝试使用 foreach 循环将每个数组添加为索引数组,但这不起作用。任何帮助将不胜感激! :) @NicholasMordecai 你所说的动态是什么意思?如果使用 3d、4d 或 5d 数组,最终可能会减少到简单数组的数量。 @NicholasMordecai 先告诉我,你的代码真的那么复杂,你有 3d、4d 等数组吗?或者它可能需要重构?我问是因为在那个阶段事情会变得非常非常困难:) 它“应该”总是 2d 但是我不知道会有多少索引有时我可能会通过 $total[0],$total[1] 而其他时候我可能需要通过 $total[0],$total[1],$total[2],$total[3]。然而,问题是 cartesain 函数不接受关联数组,而只接受索引数组,因此 array(1,2,3) 可以工作,但 array[0] 不会。任何帮助将不胜感激。谢谢,尼克

以上是关于PHP计算二维数组的每个排列的主要内容,如果未能解决你的问题,请参考以下文章

如何用VB给二维数组排序

thinkPHP二维数组排序

求C语言二维数组元素排列组合?

二维数组列表的排列

PHP二维数组怎么按某个字段排序

求问php两个二维数组中每个元素的相加