Bir Array içine Preorder Ağaç Geçişi Veri Modifiye Başlarken

3 Cevap php

Bir içine ağaç veri koymak için etkili bir yoldur nedir array?

Ben ağaç verileri almak için sitepoint tutorial izledi.

Ancak, öğretici sadece bir multidementional dizi yapmak değil, nasıl nasıl çıktı ağaç için, gösterir.

Ben kullanılan

SELECT title, lft, rgt FROM tree_structure WHERE lft BETWEEN $parentLft  AND $parentRgt ORDER BY lft ASC

Yani her öğe için, ben onun sol başlığı, sağ ve değerlere sahiptir.

Ben dizi böyle bakmak yapma şaşırıp

Array
(
 Title: Main Topic
 Children => Array
             (
              => Title: subTopic
                     Leaf:  true
              => Title: Another subtopic
                     Children =>  Array
                               (
                                => Title: subtopic child
                                  Leaf: true
                               )
              ) 

)

Eğer yardımcı olabilir, ben gerçekten takdir ediyorum.

PS. Sql çıkış görünüyor like this (I başlığı dışında, isim değil ve category_id kullanmayın):

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |

3 Cevap

Bu kodu bir şans verin. $ Sonuçları veritabanı sonuçlanır. $ Ağacı geri alıyoruz dizidir.

function create_tree ($results) {

    $return = $results[0];
    array_shift($results);

    if ($return['lft'] + 1 == $return['rgt'])
        $return['leaf'] = true;
    else {
        foreach ($results as $key => $result) {
            if ($result['lft'] > $return['rgt']) //not a child
                break;
            if ($rgt > $result['lft']) //not a top-level child
                continue;
            $return['children'][] = create_tree(array_values($results));
            foreach ($results as $child_key => $child) {
                if ($child['rgt'] < $result['rgt'])
                    unset($results[$child_key]);
            }
            $rgt = $result['rgt'];
            unset($results[$key]);
        }
    }

    unset($return['lft'],$return['rgt']);
    return $return;

}
$tree = create_tree($results);

Ben bu SQL sorgusu yeniden başlamak istiyorum:

SELECT title, (SELECT TOP 1 title 
               FROM tree t2 
               WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
               ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC

Bu, böyle sonuç verecektir:

title                | parent
----------------------------------------------
ELECTRONICS          | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS          | ELECTRONICS
MP3 PLAYERS          | PORTABLE ELECTRONICS
FLASH                | MP3 PLAYERS
CD PLAYERS           | PORTABLE ELECTRONICS
2 WAY RADIOS         | PORTABLE ELECTRONICS
TUBE                 | TELEVISIONS
LCD                  | TELEVISIONS
PLASMA               | TELEVISIONS

Bu ile, çok daha kolaydır.

ben bu noktada bir hata var create_tree kullanarak:

if ($rgt > $result['lft']) //not a top-level child  continue;

Hata, dönüş diyor ki: Undefined variable: rgt

Also it did not return the correct number of array..... I am using the same database structure in

http://articles.sitepoint.com/article/hierarchical-data-database/2