php - permutation - 可能的数字

时间:2015-02-11 17:23:05

标签: php permutation

已经环顾四周,但无法找到我想要的PHP。

只是说我有一个数字:1234(可以先拆分成数组) 我想获得2位数,3位数和4位数的可能数量组合

例如:

可能的4位数字是: 1234,1243,1324,1342等。 (我不知道还有多少)

可能的2位数字是: 12,13,14,21,23,24,31,32,34,41,42,43

我得到的最接近的是:

$p = permutate(array('1','2','3','4'));
$result = array();
foreach($p as $perm) {
   $result[]=join("",$perm);
}
$result = array_unique($result);
print join("|", $result);

function permutate($elements, $perm = array(), &$permArray = array()){
    if(empty($elements)){
       array_push($permArray,$perm); return;
    }

    for($i=0;$i<=count($elements)-1;$i++){
       array_push($perm,$elements[$i]);
       $tmp = $elements; array_splice($tmp,$i,1);
       permutate($tmp,$perm,$permArray);
       array_pop($perm);
    }

    return $permArray;
}

但是如何编辑这个我可以显示3位和2位数?

由于

1 个答案:

答案 0 :(得分:0)

我得到了我想要的东西

来自@mudasobwa链接。我编辑我想要的东西。

<?php
$in = array(1,2,3,4,5,6);
  $te = power_perms($in);

 // print_r($te);
$thou=0;
$hun =0;
$pu = 0;
for($i=0;$i<count($te);$i++)
{
$jm = count($te[$i]);

    for($j=0;$j<$jm;$j++)
    {
    $hsl[$i] = $hsl[$i] . $te[$i][$j];
    }

    if($hsl[$i] >=100 && $hsl[$i] < 1000 )
    {
    $ratus[$hun] =  intval($hsl[$i]);
    $hun = $hun + 1;
    }

    if($hsl[$i] <100 && $hsl[$i] >=10)
    {
    $pul[$pu] = intval($hsl[$i]);
    $pu = $pu + 1;
    }

    if($hsl[$i] >=1000 && $hsl[$i] < 10000)
    {
    $th[$thou] = intval($hsl[$i]);
    $thou = $thou + 1;
    }
}

$th=array_unique($th);
$pul = array_unique($pul);
$ratus = array_unique($ratus);
sort($ratus);
sort($pul);
sort($th);
print_r($th);



function power_perms($arr) {

    $power_set = power_set($arr);
    $result = array();
    foreach($power_set as $set) {
        $perms = perms($set);
        $result = array_merge($result,$perms);
    }
    return $result;
}

function power_set($in,$minLength = 1) {

   $count = count($in);
   $members = pow(2,$count);
   $return = array();
   for ($i = 0; $i < $members; $i++) {
      $b = sprintf("%0".$count."b",$i);
      $out = array();
      for ($j = 0; $j < $count; $j++) {
         if ($b{$j} == '1') $out[] = $in[$j];
      }
      if (count($out) >= $minLength) {
         $return[] = $out;
      }
   }

//   usort($return,"cmp");  //can sort here by length
   return $return;
}

function factorial($int){
   if($int < 2) {
       return 1;
   }

   for($f = 2; $int-1 > 1; $f *= $int--);

   return $f;
}

function perm($arr, $nth = null) {

    if ($nth === null) {
        return perms($arr);
    }

    $result = array();
    $length = count($arr);

    while ($length--) {
        $f = factorial($length);
        $p = floor($nth / $f);
        $result[] = $arr[$p];
        array_delete_by_key($arr, $p);
        $nth -= $p * $f;
    }

    $result = array_merge($result,$arr);
    return $result;
}

function perms($arr) {
    $p = array();
    for ($i=0; $i < factorial(count($arr)); $i++) {
        $p[] = perm($arr, $i);
    }
    return $p;
}

function array_delete_by_key(&$array, $delete_key, $use_old_keys = FALSE) {

    unset($array[$delete_key]);

    if(!$use_old_keys) {
        $array = array_values($array);
    }

    return TRUE;
}
?>