Bir çok düzeyli dizinin tüm kombinasyonları listelemek için özyinelemeli işlev oluşturmak nasıl?

2 Cevap php

Ben herhangi bir sayıda öğe içerebilir bir dizi var. Her eleman bir kimlik ve (aynı zamanda elemanların herhangi bir sayı ile) "seçenekleri" adında bir dizi içerir. İşte yapıdır:

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

Ben bu bir kapalı dayalı bir dizi oluşturmak istiyorum. Her anahtar kimliği alanı + bir 'seçenek' dizi değeri ve değer böylece bir sonraki elemanın bir dizi, ve sonra bir sonraki ve bir. Temelde dizi tanımlanmış olduğu için, bana (bir çeşit bir ağaç gibi) yukarıdaki dizilerin her kombinasyonu vermelidir:

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

Dizi elemanlarının herhangi bir sayı içerebilir, çünkü ben özyinelemeli fonksiyonun bazı tip dahil gerekir varsayarak yaşıyorum. Ben özyineleme çok deneyimim yok, bu benim için oldukça zor bir iştir.

Bu özyinelemeli işlevi bina başlatmak için nerede bazı öneriler alabilir miyim?

2 Cevap

Bu nasıl? Tabii orada bir hata var, ama onun doğru yönde gidiyor ....

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;
}

Ben bir PHP tane, ama bir Python birini sağlayamaz:

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

Bu verir

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