将递归目录列表转换为MySQL表

时间:2017-03-23 15:54:45

标签: php mysql recursion

我需要列出给定父文件夹中的所有文件/文件夹,并将其转储到mysql。

到目前为止,我有:

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$dir = '/home/kevinpirnie/www';

function dirToArray( $dir ) {
    $result = array();
    $cdir = scandir($dir);
    foreach ($cdir as $key => $value) {
        if (!in_array($value, array(".", "..")))  {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $value)){
                $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
            } else {
                $result[] = $value;
            }
        }
    }
    return $result;
}

$res = dirToArray($dir);

echo '<hr />';
echo '<pre>';
print_r($res);
echo '</pre>';

我坚持的是如何将ID分配给目录,然后将它们与父ID相关联。

现在,这段代码完成了我需要它的工作,我只需要能够将它转换为mysql插入语句,同时保持关联结构,并且我在长时间的工作中脑力激荡。 / p>

最后,我希望有一个类似于:

的表结构

FileID,FolderID,ParentFolderID,FileName

我该怎么做?

6 个答案:

答案 0 :(得分:4)

尝试这样的事情:

function dirToDb($res, $parentId = 0)
{
    foreach ($res as $key => $value) {
        if (is_array($value))  {
            $db->exec("insert into table (path, parentId) VALUES (?, ?)", [$key, $parentId]);
            dirToDb($value, $db->fetch("SELECT LAST_INSERT_ID()"));
        } else {
            $db->exec("insert into table (path, parentId) VALUES (?, ?)", [$value, $parentId]);
        }
    }
}

$res = dirToArray($dir);

dirToDb($res);

答案 1 :(得分:1)

我稍微修改了你的代码。现在为每个目录,

索引0指向目录索引

索引1指向父目录索引

索引2,3,.... n指向文件

$listoftests = array($quizzes[30],$quizzes[51]);

您现在可以使用类似的递归循环直接将数据插入到mysql表中(如果您不想使用mysql自动生成的id)

如果你想使用自动生成的mysql id,你应该在两遍中插入。在第一遍中插入文件夹数据并从mysql插入id函数中获取id。然后创建一个关联数组映射

$ array_map [$ current_folder_id] = mysqli_insert_id()

然后在第二次递归传递中更新此id

答案 2 :(得分:0)

我认为您需要将文件夹名称作为记录插入到数据库中,否则您将无法获得父ID。但是,在您的结果中,文件夹名称作为记录项缺失。我修改了你的代码,假设你不需要将结果作为数组而只需要SQL语句。

<?php
$qry = array();
$result = $conn->query("SELECT MAX(FileID) as lastid FROM YOUR-TABLE-NAME-HERE");
$row = $result->fetch_assoc();
$id = $row['lastid'];
function dirToSql($dir, $parent) {
  global $qry;
  global $id;
  $result = array();
  $cdir = scandir($dir);
  foreach($cdir as $key => $value) {
    if(!in_array($value, array('.', '..'))) {
        $id++;
        $qry[] = "('".$id."', '".$dir."', '".$parent."', '".$value."')";
        if(is_dir($dir . DIRECTORY_SEPERATOR . $value)) {
            dirToSql($dir . DIRECTORY_SEPERATOR . $value, $id);
        }
    }
  }
  return $qry;
}

$dir = '/home/kevinpirnie/www';
$sql = dirToSql($dir, 0);

//Here is your SQL Statement
echo $qry = "INSERT INTO YOUR-TABLE-NAME-HERE (`FileID`, `FolderID`, `ParentFolderID`, `FileName`) VALUES ".implode(',', $sql);

您可以优化代码&amp;如果需要,查询

答案 3 :(得分:0)

Mysql目录表中的每一行都有三列 -

目录ID,目录名称,父ID

对于每个插入,父ID将指定行中当前目录的父级。对于根目录,父ID为0

答案 4 :(得分:0)

构建数据库的一种非常有用的方法是使用嵌套集。 Joomla将此用于文章类别等内容。这些可以无限地嵌套在一起。

enter link description here

答案 5 :(得分:-1)

json_encode整个数组并将其插入数据库......你还需要一列......

相关问题