Я огляделся, но я не мог найти ничего подходящего для этого.
$n = 3;//number of events $k = array(0,1);//possible outcomes
Я хотел бы иметь массив, содержащий все возможные результаты:
$result = array([0] => array(0,0,0), [1] => array(1,0,0)... [7] =>array(1,1,1));
Я пробовал этот длинный и статический метод, который не приносит мне ничего полезного:
for($a=0;$a<count($k);$a++) { for($b=0;$b<count($k);$b++) { for($c=0;$c<count($k);$c++) { $push = array($a,$b,$c); array_push($result,$push); }}}
Как я могу переписать это, чтобы получить функцию, учитывающую значение n? Поэтому, если я изменяю значение $ n до 4, я получаю массив вроде:
$result = array([0] => array(0,0,0,0), [1] => array(1,0,0,0)... [15] =>array(1,1,1,1));
Ключ здесь – рекурсивный вызов.
<?php function gen($n, $k) { if ($n == 1) { // Base case $out = array(); foreach ($k as $elem) { array_push($out, array($elem)); } return $out; } $out = array(); foreach ($k as $elem) { // Recursive call $prev = gen($n - 1, $k); foreach ($prev as $rec) { array_push($rec, $elem); array_push($out, $rec); } } return $out; } print_r(gen(4, array(0,1))); ?>
Это приведет к созданию массива по одному уровню за каждый рекурсивный вызов.
Это то, что вы хотите?
$n = 3; $arr = array(); for ($i=0; $i<pow(2,$n); $i++) { $s = str_pad(decbin($i), 3, "0", STR_PAD_LEFT); $a = array_reverse(preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY)); $arr[] = $a; } print_r($arr);