数组设置值的所有组合

时间:2014-09-12 17:18:32

标签: php arrays algorithm combinations

我需要一些帮助来为我的函数生成输入。

我有两组数组:

产品:

$products = array('prod_1'=>1,'prod_2'=>1,'prod_3'=>1,'prod_4'=>1);

价格:

$prices = array(1,2,3);

我想得到的是一个循环,它将输出由$ price填充的$ products数组的所有可能组合:

示例输出

# array('prod_1'=>1,'prod_2'=>1,'prod_3'=>1,'prod_4'=>1);
# array('prod_1'=>2,'prod_2'=>1,'prod_3'=>1,'prod_4'=>1);
# array('prod_1'=>1,'prod_2'=>2,'prod_3'=>1,'prod_4'=>1);
# array('prod_1'=>1,'prod_2'=>1,'prod_3'=>2,'prod_4'=>1);
# array('prod_1'=>1,'prod_2'=>1,'prod_3'=>1,'prod_4'=>2);
...
# array('prod_1'=>1,'prod_2'=>2,'prod_3'=>2,'prod_4'=>1);
...
# array('prod_1'=>2,'prod_2'=>3,'prod_3'=>1,'prod_4'=>1);
...
#1 array('prod_1'=>3,'prod_2'=>1,'prod_3'=>3,'prod_4'=>2);
etc.

更新1

在我看来,它应该像时钟一样工作:

  1. 将$ products中的所有值设置为$ price
  2. 中的第一个值
  3. 循环认为$ product的所有价值为$ product [' prod_1']
  4. 当你碰撞并将$ products [' prod_1']设置为$ price [0]并为$ products [' prod_2'](index + 1)做点2时/ LI>
  5. 执行第2点和第3点并转到index + 1,重置prev,直到所有$ products值设置为最后$ price值
  6. 输出:

    1,1,1,1
    2,1,1,1
    3,1,1,1
    1,2,1,1
    2,2,1,1
    3,2,1,1
    1,3,1,1
    2,3,1,1
    3,3,1,1
    1,1,2,1
    do it until:
    3,3,3,3
    

    我是在正确的轨道上?

1 个答案:

答案 0 :(得分:1)

好的,我明白了。

这是我的代码:

$t = new test();
$t->run();

class test{
   private $_data = array("p1"=>1,"p2"=>1,"p3"=>1);
   private $_values =array(1,2,3);
   private $_data_pos =0;
   private $_values_pos =0;


public function run(){
    while($this->combos()==true){
        // do sth with $this->_data
        echo "<pre>";
        var_dump($this->_data);
        echo "</pre>";
    }
}

function combos(){
    $keys = array_keys($this->_data);
    if($this->_values_pos>count($this->_values)-1){ 
        $this->_values_pos = 0;

        while($this->_data[$keys[$this->_data_pos]]==$this->_values[count($this->_values)-1]){

            $this->_data[$keys[$this->_data_pos]] = $this->_values[0];
            $this->_data_pos++;
            if(empty($keys[$this->_data_pos])) return false;

        }
        $k = array_search($this->_data[$keys[$this->_data_pos]],$this->_values);
        $this->_data[$keys[$this->_data_pos]] = $this->_values[$k+1];
        $this->_data_pos=0;

            //return true;
    }
    $this->_data[$keys[$this->_data_pos]] = $this->_values[$this->_values_pos];

    $this->_values_pos++;

    return true;
}

}

输出:

array(3) {
  ["p1"]=>
  int(1)
  ["p2"]=>
  int(1)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(2)
  ["p2"]=>
  int(1)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(3)
  ["p2"]=>
  int(1)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(1)
  ["p2"]=>
  int(2)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(2)
  ["p2"]=>
  int(2)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(3)
  ["p2"]=>
  int(2)
  ["p3"]=>
  int(1)
}
array(3) {
  ["p1"]=>
  int(1)
  ["p2"]=>
  int(3)
  ["p3"]=>
  int(1)
}