Bir ağaca bir tablonun değerlerini alma

1 Cevap php

Yani, böyle gibi bir tablo var:

id|root|kw1|kw2|kw3|kw4|kw5|name
 1|   A|  B|  C|  D|  E|  F|fileA
 2|   A|  B|   |   |   |   |fileB
 3|   B|  C|  D|  E|   |   |fileC
 4|   A|  B|   |   |   |   |fileD

(Birkaç yüz satır ...)

Ve ben aşağıdaki gibi bir ağaca almak gerekir:

*A
 *B
  -fileB
  -fileD
 *C
  *D
   *E
    *F
     -fileA
*B
 *C
  *D
   *E
    -fileC

Ben tablo kötü dışarı atılır eminim ama ben yaşamak ne var.

Ben komşuluk Liste Modeli ve hakkında biraz okudum Preorder Ağaç Traversal'i modifiye ama benim veriler doğru yatırılır sanmıyorum. Ben bu bir özyinelemeli işlev gerektirir düşünüyorum, ama ben hiç bu konuda gitmek nasıl emin değilim.

Ben bu sadece bu işlem için yeni bir tabloya veri ayıklama anlamına gelse bile halletmek için nasıl herhangi bir fikir açığım.

Bana uygun herhangi bir iyi seçenek ya da bunu yapmak için herhangi bir iyi bir yolu var mı? (Örnekler elbette bir bonus)

1 Cevap

Burada ben ile gelebilir basit çalışma çözümdür.

Varsayımlar:

  1. Sen diziler bir dizi (sizin sonuç ayarlanmış) var; o $rows adlandırılır.
  2. Yukarıda vermek set sonucunda boş sütun değerleri null eşittir.
  3. Isimleri tamsayılar dize temsilleri ağacın hiçbir şubesi bulunmaktadır.

Kodu:

$tree = array();

foreach($rows as $row) {
    // Second parameter: array of 6 items as per your sample result set
    place_in_tree($tree, array($row['root'], ... $row['kw5']), $row['file']);
}

function place_in_tree(array $tree, array $path, $item) {
    // While there are more branches to be taken in $path
    while(($branch = array_shift($path)) !== null) {
        // Create the new branch if it doesn't exist
        if(!isset($tree[$branch])) {
            $tree[$branch] = array();
        }

        // Select the subtree in that branch for the next iteration
        $tree = $tree[$branch];
    }

    // Finally, add the item
    $tree[] = $item;
}

Bu iç içe diziler ile bir dizi oluşturur. Bu dizi dize anahtarları (bu "dallar", ve tiptedir array) ve sayısal tuşları öğeleri bir dizi (bu "dosya", ve tipi {vardır öğelerin bir dizi içerir [ (1)]}). Çocuk diziler aynı şekilde doldurulur.

Eğer kocaman bir dizisi daha iş modeline daha yakın bir şey gerektiriyorsa, place_in_tree Yukarıdaki fonksiyon şube seçimi ve madde depolama mantığı çimdik.

Varsayım 3. Yukarıdaki durumda da tutmaz eğer Ayrıca, sen ağacın dalları ve yaprakları ayrı anlatmak için belirsiz olmayan bir yolu seçerek, ya da başka bir yapının seçimi ya, aynı şekilde küçük bir yer almak gerekir onu temsil eder.