如何从MySQL数据库记录中生成PHP数组以实现多级文件夹结构

ocebsuys  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(34)

我想用PHP和MySQL构建一个Evernote风格的笔记应用程序。
Evernote允许顶级文件夹中包含笔记记录。
我想让我的应用程序允许文件夹内的文件夹,使顶级文件夹可以有一个子文件夹,然后有注意到记录内的子文件夹。
就像下面这张图片:


的数据
我有这个PHP函数,它将建立在上面的图像所示的结构菜单.
这段代码构建了如下菜单:

<?php
function tree($array, $parent, $parts = array(), $step = 0) {

    if (!count($array)) {
        return '';
    }

    $tid = ($step == 0) ? 'id="tree"' : '';
    $t = '<ul class="unstyled" '.$tid.'>';

    foreach ($array as $key => $item) {
        if (is_array($item)) {
            $open = $step !== false && (isset($parts[$step]) && $key == $parts[$step]);

            $t .= '<li class="directory'. ($open ? ' open' : '') .'">';
                $t .= '<a href="#" data-role="directory"><i class="glyphicon glyphicon-folder-'. ($open ? 'open' : 'close') .'"></i>&nbsp; ' . $key . '</a>';
                $t .= tree($item, "$parent/$key", $parts, $open ? $step + 1 : false);
            $t .=  '</li>';
        } else {
            $selected = (isset($parts[$step]) && $item == $parts[$step]);
            $t .= '<li class="file'. ($selected ? ' active' : '') .'"><a href="'. $parent .'/'. $item . '">'.$item.'</a></li>';
        }
    }

    $t .= '</ul>';

    return $t;
}
?>

字符串
上面的代码通过调用_getTree()构建树菜单

protected function _getTree($dir = LIBRARY)
{
    $return = array('directories' => array(), 'files' => array());

    $items = scandir($dir);
    foreach ($items as $item) {
        if(preg_match($this->_ignore, $item)) {
            if($this->_force_unignore === false || !preg_match($this->_force_unignore, $item)) {
                continue;
            }
        }

        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) {
            $return['directories'][$item] = $this->_getTree($path);
            continue;
        }

        $return['files'][$item] = $item;
    }

    uksort($return['directories'], "strnatcasecmp");
    uksort($return['files'], "strnatcasecmp");

    return $return['directories'] + $return['files'];
}


上面的_getTree()通过扫描服务器上的目录来查找文件夹和文件,以下面所示的格式构建一个数组。然后将该数组传递给tree()。我的目标是让一个函数构建这个相同风格的数组,但来自MySQL数据库文件夹和笔记记录。
我需要写一个函数,可以从两个数据库表构建如下数组。
我的数据库表将是

*notebooks,列名parent表示父文件夹。如果笔记本是父笔记本的子文件夹,则笔记本ID将进入父字段。0 ==父级文件夹。
*notesparent列链接到笔记本ID。

代码:

Array(
    [top_level_notebook_1] => Array(
            [child_note_of_parent_notebook_1.html] => some_note.html
            [child_level_notebook_1] => Array(
                    [note_1.html] => some_note.html
            )

            [child_level_notebook_2] => Array(
                    [note_2] => cache.js
                    [note_3] => cache.js.md
                    [note_4] => Confirmation-Dialog.js
            )

            [child_level_notebook_3] => Array(
                    [crud.php] => crud.php
                    [error2mysql.php] => error2mysql.php
                    [upload_file_from_remote_url.php] => upload_file_from_remote_url.php
            )

    )

    [top_level_notebook_2] => Array(
            [note_7.html] => some_note.html
    )

    [root_level_note.html] => Dev_Bookmarks.html
)

qvk1mo1f

qvk1mo1f1#

除非你想让你的查询变得非常复杂,否则我会沿着获取所有记录并用你的脚本构建一个数组的路线做更多的事情。类似于这样:
脚本现在包括数据库的东西(更新):

//Change these credentials!
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$query = "SELECT nb.`name` AS 'notebook', no.`name` AS 'note', (SELECT `name` FROM `notebooks` WHERE `id` = nb.`parent`) AS 'nbparent', no.`parent` AS 'noparent' FROM `notebooks` nb RIGHT JOIN `notes` no ON no.`parent` = nb.`id` WHERE (nb.`active` = 1 OR nb.`active` IS NULL) AND (no.`active` = 1 OR no.`active` IS NULL)";

$result = $mysqli->query($query);

$myArray = array();

while($row = $result->fetch_assoc()){
    if($row['nbparent']){
        if($row['note']) $myArray[$row['nbparent']][$row['notebook']][] = $row['note'];
    } else {
        if($row['note']) {
            if($row['notebook']) $myArray[$row['notebook']][] = $row['note'];
                else $myArray[] = $row['note'];
        }

    }

}

var_dump($myArray);

字符串
这应该可以工作!我在本地开发环境中测试了它,并得到了一组测试数据的结果:

array (size=4)
  'Parent Notebook1' => 
    array (size=6)
      0 => string 'Note1' (length=5)
      1 => string 'Note2' (length=5)
      2 => string 'Note5' (length=5)
      'Child Notebook1' => 
        array (size=1)
          0 => string 'Note6' (length=5)
      'Child Notebook2' => 
        array (size=1)
          0 => string 'Note7' (length=5)
      'Child Notebook3' => 
        array (size=1)
          0 => string 'Note8' (length=5)
  'Parent Notebook2' => 
    array (size=1)
      0 => string 'Note3' (length=5)
  'Parent Notebook3' => 
    array (size=1)
      0 => string 'Note4' (length=5)
  0 => string 'Note With No Parent :(' (length=22)


这样做的目的是循环遍历每个结果。当然,你需要将列名(比如在$row 'notebook']中)更改为实际列的名称。它将在一级深度工作。如果你需要更多,你必须调整一下。这是总体思路,但是,应该从你的结构中构建一个数组。

快速说明

上面的代码不会是严格友好的。如果你关心警告,上面的代码会给你给予关于未定义键的警告。它会为你创建它们,因为我们都对PHP爱恨交加。如果你想避免键警告,你可以很容易地用if(array_key_exists())弹出一些键检查。

潜在的'Gotcha'

这适用于名称。如果您允许“notebooks”使用相同的名称,我建议您更进一步,通过id而不是基于文本的列(如notebook的标题)构建数组。从那里,您需要在每个notebook中添加一个新的键。我复制了您在制作此脚本时在示例中提供的数组,但我确实想绝对肯定你理解这种方法所涉及的潜在(令人沮丧的)“gotcha”。
让我知道如果你有任何问题,希望这能有所帮助。

相关问题