PHP中多维数组的排列

时间:2013-09-21 17:30:08

标签: php arrays multidimensional-array permutation

我正在努力完成以下任务,但我似乎无法做到正确。即使我愿意,我也不认为我这样做是正确的。

假设我有这个数组:

$array = array(
    array(1, 2, 3),
    array(1, 2, 3),
    array(1, 2, 3)
);

现在我想获得多维数组的所有排列,但每个'子数组'仍然必须有1,2和3.所以这些都可以:

$array = array(
    array(2, 1, 3),
    array(1, 2, 3),
    array(1, 2, 3)
);

$array = array(
    array(2, 3, 1),
    array(1, 2, 3),
    array(1, 2, 3)
);

但这不是:

$array = array(
    array(3, 3, 3),
    array(1, 2, 1),
    array(1, 2, 2)
);

我已经尝试了很多,但我不断回头的是大量的for循环。这似乎不是实现这一目标的正确方法。

我希望有人可以提供帮助!

2 个答案:

答案 0 :(得分:-1)

我没有得到你想要的东西 - 而且你无法清楚地表达你想要的东西......但这至少创造了你所给出的例子。

$array = array(
  array(1, 2, 3),
  array(1, 2, 3),
  array(1, 2, 3)
);


foreach ($array AS $key => $values) {
  shuffle($array[$key];
}

var_dump($array);

答案 1 :(得分:-2)

代码是:Get all permutations of a PHP array?

的修改版本

如果您的集合始终具有三个不同的值,则可以使用三个嵌套for循环执行此操作。否则,如果您需要在可变大小的输入上执行此操作,则需要执行递归。此外,如果子数组始终包含相同的值,则它不必是多维的。像这样:

function getPerms($items, $perms = array(), &$return) {
    if (empty($items)) {
      $return[] = $perms;
    }
    else {
      for ($i = count($items) - 1; $i >= 0; --$i) {
         $newitems = $items;
         $newperms = $perms;
         list($foo) = array_splice($newitems, $i, 1);
         array_unshift($newperms, $foo);
         $this->pc_permute($newitems, $newperms, $return);
      }
    }
 }

然后用:

来调用它
$return = array();
getPerms(array(1,2,3), array(), $return);

$ return将包含这三个数字的所有排列。