PHP mySQL Ağaç Düğümü Hareketli

1 Cevap php

Ben alt düğümleri hareket çalışıyor sorun yaşıyorum ya da ebeveyn matematik o kadar iyi değil ... aşağı yukarı düğümleri ya.

CREATE TABLE IF NOT EXISTS `pages` (   `page-id` mediumint(8) unsigned

NOT NULL AUTO_INCREMENT, page-left mediumint(8) unsigned NOT NULL,
page-right smallint(8) unsigned NOT NULL, page-title text NOT NULL,
page-content text NOT NULL,
page-time int(11) unsigned NOT NULL, page-slug text NOT NULL,
page-template text NOT NULL,
page-parent mediumint(8) unsigned NOT NULL, page-type text NOT NULL, PRIMARY KEY (page-id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

INSERT INTO pages (page-id, page-left, page-right, page-title, page-content, page-time, page-slug, page-template, page-parent, page-type) VALUES (17, 1, 6, '1', '', 0, 'PARENT', '', 0, ''), (18, 2, 5, '2', '', 0, 'SUB', '', 17, ''), (19, 3, 4, '3', '', 0, 'SUB-SUB', '', 18, ''), (20, 7, 8, '5', '', 0, 'TEST', '', 0, '');

Örnek olarak nasıl TEST ORTAKLIK yukarıda yukarı hareket edeceğini ve page-left/page-right kimlikleri ile oynayarak aşağı alt-alt altında hareket SUB demek? Kod sadece bunun için SQL kavram ya da matematik yardım gerekli değildir, ben bunu daha iyi taşımak için nasıl anlamanıza yardımcı olacaktır ...

1 Cevap

Yani temelde iç içe geçmiş bir dizi bir komşuluk listesini dönüştürmek istiyorsun? Birinci (yani yeni ağaç için doğru değerler page_parent değerlerini güncellemek) adjacency listesini güncellemek, sonra aşağıdaki dönüşüm çalıştırmak.

PHP Kullanımı (temel kod, denenmemiş):

class Tree
{    
    private $count = 0;
    private $data = array();

    /**
     * Rebuild nested set
     * 
     * @param $rawData array Raw tree data
     */
    public function rebuild($rawData)
    {
        $this->data = $rawData;
        $this->count = 1;
        $this->traverse(0);        
    }

    private function traverse($id)
    {
        $lft = $this->count;
        $this->count++;

        if (isset($this->data[$id])) {
            $kid = $this->data[$id];
            if ($kid) {
                foreach ($kid as $c) {
                    $this->traverse($c);
                }
            }
        }

        $rgt = $this->count;
        $this->count++;

        // TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
        ...
    }
}

Aradığınızda, $ rawData ebeveyn-id tarafından endeksli kimlikleri bir dizi içermelidir aşağıdaki gibi ($ db etkin bir PDO bağlantı nesnesi içermelidir) (tablo yapısına dayalı) oluşturmak olabilir:

    $sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';

    $stmt = $db->prepare($sql);
    $rawData = array();
    $stmt->execute();
    while ($row = $stmt->fetch()) {
        $parent = $row['page_parent'];
        $child = $row['page_id'];
        if (!array_key_exists($parent, $rawData)) {
            $rawData[$parent] = array();
        }
        $rawData[$parent][] = $child;
    }

Eğer gibi bir şey gerekir dönüşüm yapmak için:

$tree = new Tree();
$tree->rebuild($rawData);

Yani temelde düğüm başına doğru sol ve sağ değerlerini belirlemek için bir özyinelemeli şekilde geçilen edilecektir ebeveyn tarafından dizine ağacında tüm düğümleri içeren bir dizi oluşturmak.

BTW You could do it in plain SQL (after you adapt table/column names) : http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure