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($resCount, 0, 0) . " 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(0, count($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(" » ", 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.