2009-07-25 2 views
1

Ich habe ein Array, das eine beliebige Anzahl von Elementen enthalten kann. Jedes Element enthält eine ID und ein Array namens "Optionen" (auch mit einer beliebigen Anzahl von Elementen). Hier ist die Struktur:Wie man rekursive Funktion baut, um alle Kombinationen eines mehrstufigen Arrays aufzulisten?

$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 
      ); 

Ich mag würde ein anderes Array erstellen, aus der Basis dieses. Jeder Schlüssel ist das ID-Feld + ein 'Option' Array-Wert, und der Wert ist ein Array des nächsten Elements, und dann der nächste, und so weiter. Grundsätzlich sollte es mir jede Kombination der obigen Anordnungen geben (Art wie ein Baum), in der Reihenfolge, die das Array definiert:

$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') 
          ) 
      ); 

da das Array eine beliebige Anzahl von Elementen enthalten kann, unter der Annahme, ich bin ich müsste eine Art rekursive Funktion enthalten. Ich habe nicht viel Erfahrung in der Rekursion, also ist das eine ziemlich entmutigende Aufgabe für mich.

Könnte ich ein paar Hinweise darauf bekommen, wo ich beim Aufbau dieser rekursiven Funktion anfangen soll?

Antwort

1

Hows das? Sicher gibt es da einen Fehler, aber in die richtige Richtung sein gehen ....

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

Dank Ben, ich schätze es wirklich! Das gibt mir eine gute Vorstellung davon, was ich brauche. Ich werde es ausprobieren und Sie wissen lassen. –

+0

Die Logik in Ihrem Beispiel war ziemlich perfekt. Danke noch einmal! –

0

ich man eine PHP nicht bieten kann, sondern eine Python ein:

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)) 

Dies gibt

{'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']}} 
+0

Danke für das umfangreiche Beispiel Martin! Schade, ich weiß nicht Python :( –

Verwandte Themen