id = $id; $this->name = $name; $this->parentid = $parentid; $this->immedsize = $immedsize; $this->subdir = array(); $this->totalsize = 0; } }; function fixup_subdir($dirlist) { foreach($dirlist as $id => $dirobj) { if($dirobj->parentid != 0) { $dirlist[$dirobj->parentid]->subdir[] = $dirobj; } } } function calculate_totalsize($dir) { $res = $dir->immedsize; foreach($dir->subdir as $subdir) { $res += calculate_totalsize($subdir); } return $res; /* // use this version for serious use: if($dir->totalsize == 0) { $dir->totalsize = $dir->immedsize; foreach($dir->subdir as $subdir) { $dir->totalsize += calculate_totalsize($subdir); } } return $dir->totalsize; */ } function fixup_totalsize($dirlist) { foreach($dirlist as $id => $dirobj) { $dirobj->totalsize = calculate_totalsize($dirobj); } } function load() { $dirlist = array(); $con = new mysqli('localhost', 'root', '', 'Test'); $stmt = $con->prepare('SELECT dirs.id,dirs.name,dirs.parent,SUM(size) AS sumsize FROM dirs LEFT JOIN files ON dirs.id=files.dir GROUP BY dirs.id,dirs.name,dirs.parent;'); $stmt->execute(); $stmt->bind_result($id, $name, $parentid, $immedsize); while($stmt->fetch()) { $dirlist[$id] = new Dir($id, $name, $parentid, $immedsize); } $stmt->close(); $con->close(); fixup_subdir($dirlist); fixup_totalsize($dirlist); return $dirlist; } $dirlist = load(); foreach($dirlist as $id => $dirobj) { echo sprintf("%-20s %8d\r\n", $dirobj->name, $dirobj->totalsize); } ?>