Thema: Nested Set
Einzelnen Beitrag anzeigen
Alt 07.07.2009, 18:51  
Chriz
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ich hab meinen Ansatz gerade nochmal getestet:

Beispiele erzeugen:
PHP-Code:
<?php
function getFSTree($baseDir, &$stream$parentId 0)
{
    static 
$id 0;
    ++
$id;
    foreach (
glob("$baseDir/*") as $file) {
        if (
$file == "." || $file == "..") {
            continue;
        }
        
fputs($stream$id ";" basename($file) . ";" $parentId PHP_EOL);
        if (
is_dir($file)) {
            
getFSTree($file$stream$id);
        }
        ++
$id;
        if (
$id 25000) {
            break;
        }
    }
}

$file "./fs.csv";
$stream fopen($file"w");
getFSTree("E:/"$stream);
fclose($stream);
$file str_replace("\\""/"realpath($file));

mysql_connect("localhost""***""***");
mysql_select_db("***");

$sqlDrop "DROP TABLE IF EXISTS `my_filesystem`";
$resDrop mysql_query($sqlDrop) or die(mysql_error() . PHP_EOL $sqlDrop);

$sqlCreate "
    CREATE TABLE `my_filesystem` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
    `parent_id` INT UNSIGNED NOT NULL
    ) ENGINE = InnoDB;"
;
$resCreate mysql_query($sqlCreate) or die(mysql_error() . PHP_EOL $sqlCreate);

$sqlLoadData "
    LOAD DATA INFILE '$file' INTO TABLE `my_filesystem`
    FIELDS TERMINATED BY ';'"
;
$resLoadData mysql_query($sqlLoadData) or die(mysql_error() . PHP_EOL $sqlLoadData);

$sqlCount "SELECT COUNT(*) FROM `my_filesystem`";
$resCount mysql_query($sqlCount) or die(mysql_error() . PHP_EOL $sqlCount);
echo 
mysql_result($resCount00) . " Datensaetze";
?>
Alle knapp 23.000 (!) Datensätze auslesen, Baum erzeugen, und davon einen zufällig auswählen und mit Name, Kinderanzahl und Breadcrumb anzeigen. Dauer: 0.3 bis 0.4 Sekunden.
PHP-Code:
<?php
mysql_connect
("localhost""***""***");
mysql_select_db("***");

$microStart explode(" "microtime());

class 
Tree
{
    public 
$id;
    public 
$parent;
    public 
$parentId;
    public 
$children = array();
    public 
$name;
}

$trees     = array();
$sqlSelect "SELECT * FROM `my_filesystem`";
$resSelect mysql_query($sqlSelect) or die(mysql_error() . PHP_EOL $sqlSelect);

while(
$data mysql_fetch_array($resSelect)) {
    
$tree = new Tree();
    
$tree->id $data["id"];
    
$tree->parentId $data["parent_id"];
    
$tree->name $data["name"];
    
$trees[$tree->id] = $tree;
}
$randomIndex mt_rand(0count($trees));
$random null;
while (
$tree current($trees)) {
    if (
$tree->parentId) {
        
$parent $trees[$tree->parentId];
        
$parent->children[] = $tree;
        
$tree->parent $parent;
    }
    if (--
$randomIndex == 0) {
        
$random $tree;
    }
    
next($trees);
}
assert('$random instanceof Tree');
// show element
echo "FS: "$random->name"<hr />""Childcount: "count($random->children), "<hr />";
// breadcrumbs
$tree $random;
$breadcrumbs = array();
do {
    
$breadcrumbs[] = $tree;
    
$tree $tree->parent;
} while (
$tree instanceof Tree);
echo 
implode(" &raquo; "array_map(create_function('$tree''return $tree->name;'), array_reverse($breadcrumbs))), "<hr />";

$microClose explode(" "microtime());
echo 
"required: ", ($microClose[1] - $microStart[1]) + ($microClose[0] - $microStart[0]), "s";
?>
Ausgabe:
Code:
FS: DSCN0420.JPG
Childcount: 0
Backup » 2005-01-01 » c » g » localhost » public_html » ling » img » gallery » 2 » th » DSCN0420.JPG
required: 0.390646s
Zugegeben die Tree-Klasse ist ziemlich schlank und viele Datenspalten enthält das Beispiel jeweils nicht, aber immerhin, für ein parent_id System find ich das akzeptabel.

@Threadstarter:
Sorry für OT, falls du wirklich nur auf Nested Set eingehen wolltest.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten