Число рекурсивных папок PHP (ООП, не буквальные папки) - PullRequest
0 голосов
/ 18 октября 2011

Просто чтобы подтвердить @comments: это НЕ буквальные папки, они представлены с использованием объектов и все существуют в одной папке, известной MySQL. Работа с чужим кодом - я бы использовал настоящее дерево документов.

Редактировать 2: Ребята, в основном, документы хранятся где-то, но их расположение не имеет значения. Чтобы сделать администратора лучше и связать вещи с документами, есть несколько классов, DocumentCategory, которая является папкой как бы. Мне нужно подсчитать в папках общее количество файлов, включая подпапки, чтобы я не отображал пустое дерево.

Я пытаюсь написать рекурсивную функцию, которая подсчитывает файлы в папке, которая может иметь подпапки. Вот что у меня есть, но я не уверен, как мне вести счет:

function recursiveCount($id, $access_permission, $count) {
    global $db;
    $count = 0;
    $count += Document::GetAll($id, $access_permission);

    $docCats = DocumentCategory::GetAll($id);
    if(!empty($docCats)) {
        foreach($docCats as $docCat) {
            // what to do recursively
            // i need to call this function again
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Предположим, у вас есть файлы и папки, каждый файл принадлежит одной папке, и каждая папка может иметь свою родительскую папку.Итак, в базе данных есть две таблицы:

files
  id: int
  folder_id: int
  name: varchar(255)

folders
  id: int
  parent: int
  name: varchar(255)

В этом случае я написал бы такой код:

$files = $foldes = array();

$res = mysql_query("select * from folders");
while ($rw = @mysql_fetch_array($res)) {
  $rw["children"] = $folders[$rw["id"]]["children"];
  $folders[$rw["id"]] = $rw;
  $folders[$rw["parent"]]["children"][] = $rw["id"];
}

$res = mysql_query("select * from files");
while ($rw = @mysql_fetch_array($res)) {
  $files[$rw["id"]] = $rw;
  $folders[$rw["folder_id"]]["inner_cnt"]++;
}

recursiveCount(0);

function recursiveCount($root) {
  GLOBAL $folders;
  $folders[$root]["cnt"] = $folders[$root]["inner_cnt"];
  foreach($folders[$root]["children"] as $i)
    $folders[$root]["cnt"] += recursiveCount($i);
  return $folders[$root]["cnt"];
}        
0 голосов
/ 18 октября 2011

Если вы пытаетесь выполнить рекурсивную функцию, делайте рекурсивные вызовы.Это точно не написано для вашего случая, но показывает процесс.

<?php

$folders = array('folder1' => array
                         ('folder2' => array
                                       ('folder3' => null,
                                        'folder4' => array
                                                     ('folder5' => null
                                                     )
                                       ),
                          'folder6' => array
                                       ('folder7' => null
                                       )
                          ),
             'folder8' => array
                          ('folder9' => null,
                           'folder10' => array
                                         ('folder11' => null,
                                          'folder12' => null,
                                          'folder13' => null
                                         )
                          )
             );

function countFolders($folders, $numFolders = 0) {
    foreach ($folders as $folderName => $subFolders) {

        // increment the number of folders we've encountered
        $numFolders++;

        // if this folder has subfolders...
        // This might be a function call, such as 'hasSubFolders'
        // or another check, such as an array key existing, or
        // an object property existing or being set to 1 or more
        // etc.
        if (is_array($subFolders)) {

            // count how many additional subfolders there are,
            // passing in the current folder count, and updating
            // our own copy with the new count
            $numFolders = countFolders($subFolders, $numFolders);
        }
    }
    // return the total number of folders
    return $numFolders;
}

echo countFolders($folders), "\n";

Будет выводить:

13

В качестве альтернативы, вы можете использовать ссылочную переменную:

function countFolders($folders, &$numFolders = 0) {
    foreach ($folders as $folderName => $subFolders) {
        $numFolders++;
        if (is_array($subFolders)) {
            countFolders($subFolders, $numFolders /* passed as a reference */);
        }
    }
    return $numFolders;
}

(обратите внимание на & в списке параметров функции)

...