2015-11-27 125 views
1

我使用此代碼生成矩陣中的所有組合 但它不返回輸出。你可以幫我嗎?生成矩陣的所有組合

function combos($data, $all = array(), $group = array(), $val = null,$i=0) { 
    if (isset($val)) { 
     array_push($group, $val); 
    } 
    if ($i >= count($data)) { 
     array_push($all, $group); 
    } else { 
     foreach ($data[$i] as $v) { 
      combos($data, &$all, $group, $v, $i + 1); 
     } 
    } 
    return $all; 
} 
$data = array(
    array('a', 'b'), 
    array('d', 'e', 'g'), 
    array('w', 'x', 'y', 'z') 
); 
$combos = combos($data); 
print_r($combos); 

輸出應該是

  0 1 2 
array[0] = a d w 
array[1] = a d x 
array[2] = a d y 
array[3] = a d z 
array[4] = a e w 
array[5] = a e x 
array[6] = a e y 
. 
. 
. 
array[23] = b g z 

回答

0

$allvalue and not as referenceforeach循環。此外,您不在foreach循環中收集combos函數的返回值。

修改從遞歸combo函數調用 combos($data, &$all, $group, $v, $i + 1);

$all = combos($data, $all, $group, $v, $i + 1);

+0

謝謝Prera​​k Sola –

0

捕捉的返回值,並通過從遞歸函數調用參考&$all除去通。

<?php 
function combos($data, $all = array(), $group = array(), $val = null, $i = 0) 
{ 
    if (isset($val)) { 
     array_push($group, $val); 
    } 

    if ($i >= count($data)) { 
     array_push($all, $group); 
    } else { 
     foreach ($data[$i] as $v) { 
      $all = combos($data, $all, $group, $v, $i + 1); 
     } 
    } 
    return $all; 
} 

$data = array 
(
    array('a', 'b'), 
    array('d', 'e', 'g'), 
    array('w', 'x', 'y', 'z'), 
); 

$combos = combos($data); 

print_r($combos); 

?> 

工作實施例link

+0

謝謝Samir –

0

喜歡@PerakSola和@Samir說你可以收集返回combos值的值,或可能通過引用傳遞$all變量。請使用以下代碼以正確的方式執行此操作:

function combos($data, &$all = array(), $group = array(), $val = null, $i = 0) 
{ 
    if (isset($val)) { 
     array_push($group, $val); 
    } 

    if ($i >= count($data)) { 
     array_push($all, $group); 
    } else { 
     foreach ($data[$i] as $v) { 
      combos($data, $all, $group, $v, $i + 1); 
     } 
    } 
    return $all; 
} 

$data = array 
(
    array('a', 'b'), 
    array('d', 'e', 'g'), 
    array('w', 'x', 'y', 'z'), 
); 

$combos = combos($data); 

print_r($combos);