PHP 中多维数组的排列


Permutations of multidimensional array in PHP

我正在尝试完成以下操作,但我似乎无法正确完成。即使我这样做,我认为我的做法也不对。

假设我有这个数组:

$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 循环。这似乎不是实现这一目标的正确方法。

希望有人能帮忙!

我没有得到你想要的 - 你无法清楚地表达你想要什么......但这至少创建了您作为示例给出的内容。

$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);

代码是以下内容的修改版本: 获取 PHP 数组的所有排列?

如果您的集合始终具有三个不同的值,则可以使用三个嵌套的 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将包含这三个数字的所有排列。