我想在数组上测试一个等式它们的每一个唯一组合,我怎么用PHP来做呢


I want to test an equation on arrays every unique combination of them, How could I do that using PHP?

如果我有6个数组,每个数组有6个值(非零),我想测试一个方程,同时假设他们的3个数组是零值每循环,我怎么能做到这一点?

的例子:

我有这6个数组

$row_1 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_2 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_3 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_4 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环1:

$row_1 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_2 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_3 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_4 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环2:

$row_1 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_2 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_3 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_4 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环3:

$row_1 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_2 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_3 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_4 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_5 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环4:

$row_1 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_2 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_3 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_4 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_5 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_6 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);

循环5:

$row_1 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_2 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_3 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_4 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环6:

$row_1 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_2 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_3 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_4 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_5 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

循环7:

$row_1 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_2 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_3 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_4 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);

循环8:

$row_1 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_2 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_3 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_4 = array(a => 0, b => 0, c => 0, d => 0, e => 0, f => 0);
$row_5 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);
$row_6 = array(a => 1, b => 2, c => 3, d => 4, e => 5, f => 6);

…......…

循环n:

…...div…

你基本上想要所有的"值|无值"的组合。有64种不同的组合(2^6)。获得两个值的所有组合的一个简单技巧是使用一个整数,将其增加1以获得下一个组合,然后检查它的位模式:

$origArray = array(
  array_combine(range('a', 'f'), range(1, 6)),
  array_combine(range('a', 'f'), range(1, 6)),
  array_combine(range('a', 'f'), range(1, 6)),
  array_combine(range('a', 'f'), range(1, 6)),
  array_combine(range('a', 'f'), range(1, 6)),
  array_combine(range('a', 'f'), range(1, 6)),
);
$emptyArray = array_fill_keys(range('a', 'f'), 0);
define('COMBINATION_LENGTH', 6);
for($combination = pow(2, COMBINATION_LENGTH)-1; $combination >= 0; --$combination) {
  $currentCombinationArray = array();
  for($bitPosition = 0; $bitPosition < COMBINATION_LENGTH; ++$bitPosition) {
    $includeArray = ($combination >> (COMBINATION_LENGTH - $bitPosition - 1)) & 1;
    $currentCombinationArray[$bitPosition] = $includeArray ? $origArray[$bitPosition] : $emptyArray;
  }
  var_dump($currentCombinationArray);
}

这个可以工作,但是我不确定它会有多好。

我不明白这样做的目的,但也许是这样的?

而不是使用$row1, $row2, $row3等我做了这些数组。数组在这种情况下使用起来更灵活。我做了一个如何将当前变量输入到一个数组中的例子。

我已经更改了代码,现在我正在使用不同的方法。我使用一个对象来存储数组,然后在每次循环迭代时使用对象中存储的数组来"重置"。(OOP是做事情的最好方式:-))

<?php
//Create a class to handle array
class arrayHandler {
    private $row = array();
    public function __construct(Array $row) {
        $this->row = $row; //Put array into object member
    }   
    public function loopArray($num=7, $numRandomEntries=3) {
        for ($nr = 0;$nr<intval($num);$nr++) { //Do seven loops
            //Get array stored in object
            $row = $this->row;
            //Get three random keys from the $row-array
            $randomEntries = array_rand($row, intval($numRandomEntries));
            //Set random entries elements to value 0
            foreach($randomEntries as $key) {
                $row[$key] = array_fill_keys(range('a', 'f'), 0);
            }
            $nNr = $nr+1;
            echo "row$nNr = " . print_r($row,true)."<hr />"; //For testing
        }
    }
}
//Your variables with stored arrays...
$row1 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
$row2 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
$row3 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
$row4 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
$row5 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
$row6 = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6);
//Create ONE array from each variable above
$row = array();
$row[0] = $row1;
$row[1] = $row2;
$row[2] = $row3;
$row[3] = $row4;
$row[4] = $row5;
$row[5] = $row6;
//Create the object and do the looping
$ah = new arrayHandler($row);
$ah->loopArray();
?>