在PHP中获取数组的所有排列

您可以通过两种方式找出数组的所有不同排列。

第一种是使用递归算法。这将数组缩小了一点,然后又将其重新粘贴在一起,最终导致了所有可用的不同排列。

$list = array();

function recursive_permutations($items,$perms = array( ))

{

 static $list;

 if (empty($items)) {

  $list[] = join(',', $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);

   recursive_permutations($newitems, $newperms);

  };

  return $list;

 };

}

$perms = recursive_permutations(range(1,3));

echo '<pre>' . print_r($perms, true) . '</pre>';

替代方法是使用强制方法,该方法只对数组进行随机组合,然后将生成的数组模式转换为字符串。这些字符串然后用作另一个数组的键。经过足够的迭代后,外部数组应包含所有可能的排列。这绝不是优雅或不错的方法,但是它在较小的数组上可以很好地工作。

function permutations($array)

{

 $list = array();

 for ($i=0; $i<=10000; $i++) {

  shuffle($array);

  $tmp = implode(',',$array);

  if (isset($list[$tmp])) {

   $list[$tmp]++;

  } else {

   $list[$tmp] = 1;

  }

 }

 ksort($list);

 $list = array_keys($list);

 return $list;

}

$perms = permutations(range(1, 3));

echo '<pre>' . print_r($perms, true) . '</pre>';

更新18/05/2011:
回看这段代码,我发现它有点密集,因为即使找到了所有排列,它也将始终运行该数组10,000次。为了防止它始终运行循环的整个10,000次迭代,可以通过计算数组长度的阶乘来查找将找到多少个排列。一旦达到此限制,我们就可以停止阵列。

function permutations($array) {

    $list = array();

 

    $array_count = count($array);

 

    $number_of_permutations = 1;

    if ($array_count > 1) {

        for ($i = 1; $i <= $array_count; $i++) {

            $number_of_permutations *= $i;

            echo $number_of_permutations . ' ' . $i . "\n";

        }

    }

 

    for ($i=0; count($list) < $number_of_permutations; $i++) {

        shuffle($array);

        $tmp = implode(',', $array);

        if (!isset($list[$tmp])) {

            $list[$tmp] = 1;

        }

    }

 

    ksort($list);

    $list = array_keys($list);

    return $list;

}

 

以上是 在PHP中获取数组的所有排列 的全部内容, 来源链接: utcz.com/z/327656.html

回到顶部