SORU
26 Mayıs 2010, ÇARŞAMBA


Nasıl bir hiyerarşik ağaç-çocuk ebeveyn ilişkileri bir dizi dönüştürebilirsiniz?

Mümkün olduğunca az ağaç yapıları heirarchical dönüşmesini istediğim isim-parentname çiftleri bir grup var. Yani, örneğin, bu eşleştirmeleri olabilir:

Child : Parent
    H : G
    F : G
    G : D
    E : D
    A : E
    B : C
    C : E
    D : NULL

(A) heirarchical ağacı(ler) dönüştürülmesi gereken:

D
├── E
│   ├── A
│   │   └── B
│   └── C   
└── G
    ├── F
    └── H

İstediğim sonuç <ul> öğeleri iç içe geçmiş bir dizi <li> her çocuğun adını içeren.

Eşleştirmeleri tutarsızlıkları (çocuk kendi ebeveyn, çocuğun alt üst vs.) yok, iyileştirmeler bir demet muhtemelen yapılabilir.

Nasıl, PHP, bir dizi=^ çocuk içeren giderdim . üst çift, iç İçe geçmiş bir dizi için <ul>s?

Özyineleme ilgili bir his var, ama düşünmek için oldukça ayık değilim.

CEVAP
26 Mayıs 2010, ÇARŞAMBA


Bu çok temel bir özyinelemeli işlev ağaç yapısı ve bunu yazdırmak için başka bir özyinelemeli fonksiyon için çift üst/alt ayrıştırmak için gerektirir. Sadece tek fonksiyon yeterli olurdu ama burada açıklık getirmek için iki (kombine işlevi bu cevap sonunda bulunabilir).

İlk çocuk/dizisi başlatma üst bulabilirsiniz:

$tree = array(
    'H' => 'G',
    'F' => 'G',
    'G' => 'D',
    'E' => 'D',
    'A' => 'E',
    'B' => 'C',
    'C' => 'E',
    'D' => null
);

Sonra hiyerarşik bir ağaç yapısı içine bu dizi ayrıştırmak için kullandığı fonksiyon:

function parseTree($tree, $root = null) {
    $return = array();
    # Traverse the tree and search for direct children of the root
    foreach($tree as $child => $parent) {
        # A direct child is found
        if($parent == $root) {
            # Remove item from tree (we don't need to traverse this again)
            unset($tree[$child]);
            # Append the child into result array and parse its children
            $return[] = array(
                'name' => $child,
                'children' => parseTree($tree, $child)
            );
        }
    }
    return empty($return) ? null : $return;    
}

Ve ağaca sırasız bir liste yazdırmak için geçtiği bir fonksiyonu

function printTree($tree) {
    if(!is_null($tree) && count($tree) > 0) {
        echo '<ul>';
        foreach($tree as $node) {
            echo '<li>'.$node['name'];
            printTree($node['children']);
            echo '</li>';
        }
        echo '</ul>';
    }
}

Ve gerçek kullanım:

$result = parseTree($tree);
printTree($result);

İşte $result içeriği:

Array(
    [0] => Array(
        [name] => D
        [children] => Array(
            [0] => Array(
                [name] => G
                [children] => Array(
                    [0] => Array(
                        [name] => H
                        [children] => NULL
                    )
                    [1] => Array(
                        [name] => F
                        [children] => NULL
                    )
                )
            )
            [1] => Array(
                [name] => E
                [children] => Array(
                    [0] => Array(
                        [name] => A
                        [children] => NULL
                    )
                    [1] => Array(
                        [name] => C
                        [children] => Array(
                            [0] => Array(
                                [name] => B
                                [children] => NULL
                            )
                        )
                    )
                )
            )
        )
    )
)

Eğer biraz daha fazla verimlilik istiyorsanız, bu işlevleri birleştirmek ve yineleme sayısı azaltabilir:

function parseAndPrintTree($root, $tree) {
    $return = array();
    if(!is_null($tree) && count($tree) > 0) {
        echo '<ul>';
        foreach($tree as $child => $parent) {
            if($parent == $root) {                    
                unset($tree[$child]);
                echo '<li>'.$child;
                parseAndPrintTree($child, $tree);
                echo '</li>';
            }
        }
        echo '</ul>';
    }
}

Tek bir veri kümesi bu kadar küçük 8 yineleme tasarruf edeceğiz ama daha büyük kümeleri üzerinde bir fark yaratabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006