перестановка — возможное число

уже посмотри вокруг, но не могу найти то, что я хочу для 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 цифры?

Спасибо

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;
}
?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]