Вопрос сложный, конкретно меня глюконуло на одном из этапов создания, хочу понять где именно Делаю класс вычисления нахождения файлов или папки В классе есть такие понятия: $this->id - номер файла или папки, попустим id из базы данных для которого нужно построить дерево и найти местоположение файла $this->max_file_count - максимальное число файлов в папке или папок в папке $this->branches - количество ветвлений + 1 ветвление $this->upload_dir - стартовая директория Суть такова, отправив в формулу номер файла $this->id я получу его местонахождения так же я всегда могу вычислить максимальный обьем файлов который поместится в дереве папок, и считается он по формуле $this->max_file_count в степени $this->branches+1 таким образом если я задам вот такую формулу $this->max_file_count=3; $this->branches=2; то максимальный возможный обьем файлов который можно распихать по дереву будет 27 вот нарисовал картинку как это должно выглядеть На картинке показано только 2 ветки, из может быть сколько угодно Когда я запустил свой код, то понял что все работает, но не так как я планировал теперь дерево выглядит вот так Как видите, все последующие ветки нумеруются от 1 до максимально возможного числа Что я не учел в коде, чтобы он стал работать как на первой картинке? Вот сам класс Код (Text): class Upload { public $id; private $upload_dir; private $max_file_count; private $branches; public function __construct(array $param=array()) { $def_param=array('upload_dir'=>Q_PATH.'/uploads/','max_file_count'=>1000,'branches'=>2,'pattern'=>''); $upload_param=Functions::arr_union($def_param,$param);//слияние массивов в один $this->upload_dir=$upload_param['upload_dir']; $this->max_file_count=$upload_param['max_file_count']; $this->branches=$upload_param['branches']; //сложность надумана, все зависит от инодов df -i и tune2fs -l /dev/hda1 и df -Ti switch($upload_param['pattern']) { case 'bigint': $this->max_file_count=512; $this->branches=6; break; case 'int': $this->max_file_count=216; $this->branches=3; break; case 'mediumint': $this->max_file_count=204; $this->branches=2; break; case 'smallint': $this->max_file_count=182; $this->branches=1; break; } $this->del_id(); } public function set_id($id) { $this->id=$id; } public function del_id() { $this->id=0; } public function find_upload($url) { if(is_file($url)) { return true; } else { return false; } } public function get_upload($id,$fl) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i)); } $dir_file_str=implode("/", $dir_file_arr); return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function put_upload($id,$fl,$data) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i)); $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); chmod($this->upload_dir.$dir_file_str, 0777); } } file_put_contents($this->upload_dir.$dir_file_str.'/'.$this->id.$fl, $data); return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function set_upload($id,$fl) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i)); $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); chmod($this->upload_dir.$dir_file_str, 0777); } } return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function get_upload_dir($id) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i)); } $dir_file_str=implode("/", $dir_file_arr); return $this->upload_dir.$dir_file_str.'/'.$this->id; } public function set_upload_dir($id) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i)); $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); chmod($this->upload_dir.$dir_file_str, 0777); } } if(!is_dir($this->upload_dir.$dir_file_str.'/'.$this->id)) { mkdir($this->upload_dir.$dir_file_str.'/'.$this->id, 0777); chmod($this->upload_dir.$dir_file_str.'/'.$this->id, 0777); } return $this->upload_dir.$dir_file_str.'/'.$this->id; } } Вот как его запускать Код (Text): $upload = new Upload(array('upload_dir'=>'/uploads/','max_file_count'=>1000,'branches'=>2')); $file = $upload->set_upload(500,'_img.png'); echo $file; создаст дерево и выведет адрес до файла этот адрес можно потом использовать для сохранения или для чтения
тогда может считать по формуле еще и число веток в предыдущих братьях родителя и отнимать. нафига вообще такие сложности? =) чем рандом не устроил?
зная число в базе или id юзера класс сразу выдаст местоположение файла не используя файловую систему и процессорную мощность на рекурсивные поиски, либо выдаст местонахождение папки юзера при создании нового файла, тоже самое, создастся только одна ветка вся фишка в том что папок и файлов нигде не будет превышать установленное значение ну и прощитать заранее можно сколько планируется учетных записей допустим и создавать именно под нее дерево ну и вообще это круто =)