【问题标题】:Insert directory name and files in db在 db 中插入目录名称和文件
【发布时间】:2015-11-06 14:28:23
【问题描述】:

大家好,我不知道如何将数组插入数据库。 我有扫描我的目录和子目录及其文件的功能。

在我的数据库中,我需要写入目录名和文件名。

ID |  dir_name | file_name 
------------------------------
1  |  album_1  | Hero-527920799.jpg

为了扫描目录,我使用这个函数:

 function scanDirectory($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] = scanDirectory($dir . DIRECTORY_SEPARATOR . $value);
         }
         else
         {
            $result[] = $value;
         }
      }
   }

   return $result;
} 

现在如何从 foreach 或 while 循环中提取所有目录和文件?

Array
(
    [album-1] => Array
        (
            [0] => Hero-527920799.jpg
        )

    [album-2] => Array
        (
            [0] => topic-1350661050.jpg
        )

    [album-3] => Array
        (
            [0] => bigcompany.jpg
        )

    [album-4] => Array
        (
            [0] => small_animal.jpg
        )

    [album-5] => Array
        (
            [0] => little_animals.jpg
        )

)

【问题讨论】:

  • 您想将一个数组作为单行插入,还是将数组的每个元素插入一个单独的行?
  • 你知道如何从 php 中插入任何数据到 db 中吗?还是只有这种情况会给您带来问题?
  • 你不插入数组。你插入数据。在您的阵列上循环,提取数据,将其填充到数据库中,就像您将填充任何其他数据一样。
  • 兄弟,我知道 db 很好,这是多数组的问题。数据库没问题
  • 如果你了解 db,也许你需要帮助了解循环如何处理数组?

标签: php mysql sql


【解决方案1】:

第一种方法是在帖子的末尾。 将$data 设置为scanDirectory($dir) 调用的结果。

方法二:

$data = scanDirectory($dir);
$result = array();
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data), RecursiveIteratorIterator::LEAVES_ONLY);
foreach($iterator as $key => $value) {
    $parent_key = $iterator->getSubIterator($key)->key();
    $result[$parent_key][] = $value;
}

foreach($result as $key => $value) {
    foreach($value as $s_key => $s_value) {
        $sql = "INSERT INTO your_table (dir_name, file_name) VALUES ('$key', '$s_value')";
        //Execute $sql here
    }
}

方法3:

如果这是您的数据结构,那么您可以使用以下内容:

$data = array(
    'album-1'=>array(
        'Hero-527920799.jpg',
        'Hero2-527920799.jpg',
    ),
    'album-2'=>array(
        'topic-1350661050.jpg',
        'topic2-1350661050.jpg',
    ),
    'album-3'=>array(
        'bigcompany.jpg',
        'topic2-1350661050.jpg',
    ),
);

foreach($data as $key => $value) {
    foreach($value as $s_key => $s_value) {
        $sql = "INSERT INTO your_table (dir_name, file_name) VALUES ('$key', '$s_value')";
        echo $sql.'<br />';
        //Execute $sql here
    }
}

结果:

INSERT INTO your_table (dir_name, file_name) VALUES ('album-1', 'Hero-527920799.jpg')
INSERT INTO your_table (dir_name, file_name) VALUES ('album-1', 'Hero2-527920799.jpg')
INSERT INTO your_table (dir_name, file_name) VALUES ('album-2', 'topic-1350661050.jpg')
INSERT INTO your_table (dir_name, file_name) VALUES ('album-2', 'topic2-1350661050.jpg')
INSERT INTO your_table (dir_name, file_name) VALUES ('album-3', 'bigcompany.jpg')
INSERT INTO your_table (dir_name, file_name) VALUES ('album-3', 'topic2-1350661050.jpg')

第一种方法(无效):

function gatherValue($value, $key, $data) {
    $data[$key][] = $value;
}

$result = new ArrayObject();
array_walk_recursive($data, 'gatherValue', $result);

foreach($result as $key => $value) {
    $sql = "INSERT INTO your_table (dir_name, file_name) VALUES ('$key', '$value')";
}

【讨论】:

  • 尝试第二种方法。你能以数组格式展示你的数据样本吗?
  • 在我的帖子中检查数组。 scanDirectory($dir) 函数返回那个多数组
  • 只有一级深度还是scanDirectory($dir)的结果有不同的深度?
  • 这最后一次更新`$s_value` 只返回图像名称,但$s_key 是数字 (01234) 没有目录名称
  • 如果这是您的数据结构,那么您可以尝试第三种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多