2009-07-25 92 views
1

我有一個數組可以包含任意數量的元素。每個元素都包含一個ID和一個名爲「options」的數組(也包含任意數量的元素)。這裏是結構:如何構建遞歸函數來列出多級數組的所有組合?

$arr = array(
      array('id' => 10, 'options' => array(3, 5)), 
      array('id' => 15, 'options' => array(2, 4, 8, 9)), 
      array('id' => 20, 'options' => array(2, 6, 7)), 
      // ... any number of elements 
      ); 

我想創建另一個基於此的數組。每個鍵都是ID字段+「選項」數組值,該值是下一個元素的數組,然後是下一個元素,依此類推。基本上,它應該給我上述陣列的每個組合(有點像一個樹),在爲了使陣列被定義:

$new = array(
      '10-3' => array(
          '15-2' => array('20-2', '20-6', '20-7'), 
          '15-4' => array('20-2', '20-6', '20-7'), 
          '15-8' => array('20-2', '20-6', '20-7'), 
          '15-9' => array('20-2', '20-6', '20-7') 
          ), 
      '10-5' => array(
          '15-2' => array('20-2', '20-6', '20-7'), 
          '15-4' => array('20-2', '20-6', '20-7'), 
          '15-8' => array('20-2', '20-6', '20-7'), 
          '15-9' => array('20-2', '20-6', '20-7') 
          ) 
      ); 

由於數組可以包含任意數量的元素,我假設我將需要包含某種類型的遞歸函數。我在遞歸方面沒有太多經驗,所以對我來說這是一項非常艱鉅的任務。

我可以從構建這個遞歸函數的位置得到一些指針嗎?

回答

1

是否有此功能?當然那裏面有一個bug,但其在正確的方向前進....

function possibilities ($input) { 
    $output=array(); 
    $current = array_shift($input); 
    foreach ($current as #key=>$value) { 
    if empty($input) { 
     $output[] = $key.'-'.$value; 
    } else { 
     $output[$key.'-'.$value] = possibilities($input); 
    } 
    } 
    return $output; 
} 
+0

謝謝本,我真的很感激它!這給了我一個我需要的好主意。我會嘗試一下並讓你知道。 – 2009-07-25 21:54:04

+0

您示例中的邏輯非常完美。再次感謝! – 2009-07-25 22:26:45

0

我不能提供一個PHP的一個,而是一個Python之一:

arr = [ (10, [3,5]), 
     (15, [2,4,8,9]), 
     (20, [2,6,7]) ] 

def combine_options(pair): 
    id, options = pair 
    res = [] 
    for i in options: 
     res.append("%d-%d" % (id, i)) 
    return res 

def combine(arr, i): 
    res = {} 
    if i == len(arr)-1: 
     return combine_options(arr[i]) 
    for elem in combine_options(arr[i]): 
     res[elem] = combine(arr, i+1) 
    return res 

import pprint 
pprint.pprint(combine(arr,0)) 

這給

{'10-3': {'15-2': ['20-2', '20-6', '20-7'], 
      '15-4': ['20-2', '20-6', '20-7'], 
      '15-8': ['20-2', '20-6', '20-7'], 
      '15-9': ['20-2', '20-6', '20-7']}, 
'10-5': {'15-2': ['20-2', '20-6', '20-7'], 
      '15-4': ['20-2', '20-6', '20-7'], 
      '15-8': ['20-2', '20-6', '20-7'], 
      '15-9': ['20-2', '20-6', '20-7']}}