0

我正在尝试编写一个函数,它将生成一个可能的数组组合。

例子 :

$a = array('0', '1', '2');
// wanted results
// 0
// 1
// 2
// 0 0
// 0 1
// 0 2
// 1 0
// 1 1
// 1 2
// 2 0
// 2 1
// 2 2 and so on..

我想一次只得到一个组合,而不是全部组合到一个数组中。

就像是 :

getCombination(); // 0
getCombination(); // 1
getCombination(); // 2
getCombination(); // 0 0 and so on...

我的代码看起来像这样(但它没有按预期工作):

  $val = array('0', '1', '2');
  $now = array();
  $t = 0;
  $c = 0;
  $v = 0;
  $x = array();

  function inc()
  {
    global $val, $now, $t, $c, $v, $x;

    if(count($x) <> $c)
    {
      for($i = -1; ++$i < $c + 1;)
      {
        $x[$i] = 0;
        $now[$i] = $val[0];
      }
    }

    $now[$v] = $val[$t];

    if($t + 1 >= count($val))
    {
      if($c)
      {
        if($v >= $c)
        {
          $v = 0;
          ++$c;
        }
        else
        {
          ++$v;
        }
      }
      else
      {
        ++$c;
      }
      $t = 0;
    }
    else
    {
      ++$t;
    }

    echo implode(' ', $now), '<br>';
  }

  for($i = 0; $i < 150; $i++)
  {
    inc();
  }

我需要一个关于如何为此构建工作函数或类的想法。

4

2 回答 2

0

这是我的解决方案(希望对某人有所帮助):

<?php

  $val = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

  $now = array();

  $max_size = 5;

  for($i = 0; $i < $max_size; ++$i)
  {
    $now[$i] = 0;
  }

  function getCombination()
  {
    global $now, $val;

    $l = count($val);
    $t = 1;

    foreach($now as $k => &$v)
    {
      $v += $t;
      if($v <= $l)
      {
        $t = 0;
      }
      else
      {
        $v -= $l;
        $t = 1;
      }
    }
    $ar = array();

    foreach($now as $k => $v)
    {
      $ar[$k] = $val[$v - 1];
    }

    echo strrev(implode(' ', $ar)), '<br>';
  }

  // test
  for($i = 0; $i < 800; $i++)
  {
    getCombination();
  }
于 2013-03-26T16:02:23.793 回答
0

如果知道如何获取所有可能的组合,那么您可以使用以下代码来获取每次新值:

function get()
{
    static $combinations=array();
    static $current=-1;
    static $total=-1;
    if($total==-1)
    {
        $combinations=array('1', '2', '12', '21'); // or get them in any other way
        $total=count($combinations);
    }

    return $combinations[(++$current)%$total];
}

//and testing. 
for($i=0; $i<14; $i++)
{
    echo get();
}

我希望这个能帮上忙

于 2013-03-26T15:20:24.987 回答