За последние 24 часа нас посетил 19141 программист и 1639 роботов. Сейчас ищут 912 программистов ...

В чем я накосячил создавая формулу растущего дерева? о_О

Тема в разделе "Прочие вопросы по PHP", создана пользователем jora, 21 сен 2013.

  1. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Вопрос сложный, конкретно меня глюконуло на одном из этапов создания, хочу понять где именно

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

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

    $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

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

    [​IMG]

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

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

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

    [​IMG]

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

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

    Вот сам класс

    Код (Text):
    1.  
    2. class Upload {
    3.    
    4.     public $id;
    5.     private $upload_dir;
    6.     private $max_file_count;
    7.     private $branches;
    8.  
    9.     public function __construct(array $param=array()) {
    10.         $def_param=array('upload_dir'=>Q_PATH.'/uploads/','max_file_count'=>1000,'branches'=>2,'pattern'=>'');
    11.         $upload_param=Functions::arr_union($def_param,$param);//слияние массивов в один
    12.         $this->upload_dir=$upload_param['upload_dir'];
    13.         $this->max_file_count=$upload_param['max_file_count'];
    14.         $this->branches=$upload_param['branches'];
    15.         //сложность надумана, все зависит от инодов df -i и tune2fs -l /dev/hda1 и df -Ti
    16.         switch($upload_param['pattern']) {
    17.             case 'bigint':
    18.                 $this->max_file_count=512;
    19.                 $this->branches=6;
    20.             break;
    21.             case 'int':
    22.                 $this->max_file_count=216;
    23.                 $this->branches=3;
    24.             break;
    25.             case 'mediumint':
    26.                 $this->max_file_count=204;
    27.                 $this->branches=2;
    28.             break;
    29.             case 'smallint':
    30.                 $this->max_file_count=182;
    31.                 $this->branches=1;
    32.             break;
    33.         }
    34.         $this->del_id();
    35.     }
    36.    
    37.     public function set_id($id) {
    38.         $this->id=$id;
    39.     }
    40.    
    41.     public function del_id() {
    42.         $this->id=0;
    43.     }
    44.    
    45.     public function find_upload($url) {
    46.         if(is_file($url)) {
    47.             return true;
    48.         }
    49.         else {
    50.             return false;
    51.         }
    52.     }
    53.    
    54.     public function get_upload($id,$fl) {
    55.         $this->set_id($id);
    56.         for($i=$this->branches;$i>=1;$i--) {
    57.             $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
    58.         }
    59.         $dir_file_str=implode("/", $dir_file_arr);
    60.         return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
    61.     }
    62.    
    63.     public function put_upload($id,$fl,$data) {
    64.         $this->set_id($id);
    65.         for($i=$this->branches;$i>=1;$i--) {
    66.             $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
    67.             $dir_file_str=implode("/", $dir_file_arr);
    68.             if(!is_dir($this->upload_dir.$dir_file_str)) {
    69.                 mkdir($this->upload_dir.$dir_file_str, 0777);
    70.                 chmod($this->upload_dir.$dir_file_str, 0777);
    71.             }
    72.         }
    73.         file_put_contents($this->upload_dir.$dir_file_str.'/'.$this->id.$fl, $data);
    74.         return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
    75.     }
    76.    
    77.     public function set_upload($id,$fl) {
    78.         $this->set_id($id);
    79.         for($i=$this->branches;$i>=1;$i--) {
    80.             $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
    81.             $dir_file_str=implode("/", $dir_file_arr);
    82.             if(!is_dir($this->upload_dir.$dir_file_str)) {
    83.                 mkdir($this->upload_dir.$dir_file_str, 0777);
    84.                 chmod($this->upload_dir.$dir_file_str, 0777);
    85.             }
    86.         }
    87.         return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
    88.     }
    89.    
    90.     public function get_upload_dir($id) {
    91.         $this->set_id($id);
    92.         for($i=$this->branches;$i>=1;$i--) {
    93.             $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
    94.         }
    95.             $dir_file_str=implode("/", $dir_file_arr);
    96.         return $this->upload_dir.$dir_file_str.'/'.$this->id;
    97.     }
    98.    
    99.     public function set_upload_dir($id) {
    100.         $this->set_id($id);
    101.         for($i=$this->branches;$i>=1;$i--) {
    102.             $dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
    103.             $dir_file_str=implode("/", $dir_file_arr);
    104.             if(!is_dir($this->upload_dir.$dir_file_str)) {
    105.                 mkdir($this->upload_dir.$dir_file_str, 0777);
    106.                 chmod($this->upload_dir.$dir_file_str, 0777);
    107.             }
    108.         }
    109.             if(!is_dir($this->upload_dir.$dir_file_str.'/'.$this->id)) {
    110.                 mkdir($this->upload_dir.$dir_file_str.'/'.$this->id, 0777);
    111.                 chmod($this->upload_dir.$dir_file_str.'/'.$this->id, 0777);
    112.             }
    113.         return $this->upload_dir.$dir_file_str.'/'.$this->id;
    114.     }
    115.  
    116. }

    Вот как его запускать
    Код (Text):
    1.  
    2. $upload = new Upload(array('upload_dir'=>'/uploads/','max_file_count'=>1000,'branches'=>2'));
    3. $file = $upload->set_upload(500,'_img.png');
    4. echo $file;
    создаст дерево и выведет адрес до файла
    этот адрес можно потом использовать для сохранения или для чтения
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в смысле номерки тебя бесят? обнулять надо счетчик детей на каждой итерации
     
  3. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    у меня не используется обратный вызов
    а используется математическая формула
    обнулять нечего
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тогда может считать по формуле еще и число веток в предыдущих братьях родителя и отнимать.

    нафига вообще такие сложности? =) чем рандом не устроил?
     
  5. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    зная число в базе или id юзера класс сразу выдаст местоположение файла не используя файловую систему и процессорную мощность на рекурсивные поиски, либо выдаст местонахождение папки юзера
    при создании нового файла, тоже самое, создастся только одна ветка
    вся фишка в том что папок и файлов нигде не будет превышать установленное значение
    ну и прощитать заранее можно сколько планируется учетных записей допустим и создавать именно под нее дерево
    ну и вообще это круто =)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно просто срандомить пару символов и сохранить в бд имя папки...