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
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.
bir ebeveyn belirli bir çocuk için Nas...
Nasıl JavaScript bir dizi boş?...
Nasıl bir dizi belirli bir değeri vars...
Nasıl JavaScript boolean bir dize dönü...
Nasıl Java iki dizi bir arada olabilir...