powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Разминка мозгов в построении дерева без использования файловой системы
3 сообщений из 3, страница 1 из 1
Разминка мозгов в построении дерева без использования файловой системы
    #38403514
degggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос сложный, конкретно меня глюконуло на одном из этапов создания, хочу понять где именно

Делаю класс вычисления нахождения файлов или папки

В классе есть такие понятия:

$this->id - номер файла или папки, попустим id из базы данных для которого нужно построить дерево и найти местоположение файла

$this->max_file_count - максимальное число файлов в папке или папок в папке

$this->branches - количество ветвлений + 1 ветвление

$this->upload_dir - стартовая директория

Суть такова, отправив в формулу номер файла $this->id я получу его местонахождения

так же я всегда могу вычислить максимальный обьем файлов который поместится в дереве папок, и считается он по формуле

$this->max_file_count в степени $this->branches+1

таким образом если я задам вот такую формулу

Код: php
1.
2.
$this->max_file_count=3;
$this->branches=2;



то максимальный возможный обьем файлов который можно распихать по дереву будет 27

вот нарисовал картинку как это должно выглядеть



На картинке показано только 2 ветки, из может быть сколько угодно

Когда я запустил свой код, то понял что все работает, но не так как я планировал

теперь дерево выглядит вот так



Как видите, все последующие ветки нумеруются от 1 до максимально возможного числа

Что я не учел в коде, чтобы он стал работать как на первой картинке?

Вот сам класс


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
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;
    }

}




Вот как его запускать

Код: php
1.
2.
3.
$upload = new Upload(array('upload_dir'=>'/uploads/','max_file_count'=>1000,'branches'=>2'));
$file = $upload->set_upload(500,'_img.png');
echo $file;




создаст дерево и выведет адрес до файла
этот адрес можно потом использовать для сохранения или для чтения
...
Рейтинг: 0 / 0
Разминка мозгов в построении дерева без использования файловой системы
    #38403612
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
degggg Что я не учел в коде, чтобы он стал работать как на первой картинке? А уже составлен алгоритм работы "как на первой картинке", или Вы как раз и предлагаете форумчанам его разработать? ;-)
...
Рейтинг: 0 / 0
Разминка мозгов в построении дерева без использования файловой системы
    #38403660
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор$dir_file_str.'/'.$this->id
в сад.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Разминка мозгов в построении дерева без использования файловой системы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]