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

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • Christian Atlas

    Christian At

    26 Mart 2009
  • TechBalance

    TechBalance

    12 HAZİRAN 2011