使用PHP根据已解码的JSON创建文件夹/文件结构

时间:2015-09-29 02:49:01

标签: php arrays json loops recursion

例如,我在下面有一个 build.json 文件。包含我用JSON创建的基本文件夹/文件结构。

  {
    "folders": [
        {
            "name": "folder-a",
            "files": [
                {
                    "name": "file-a.html"
                },
                {
                    "name": "file-b.html"
                }
            ],
            "folders": [
                {
                    "name": "sub-folder-a",
                    "files": [
                        {
                            "name": "sub-file-a.html"
                        },
                        {
                            "name": "sub-file-b.html"
                        }
                    ]
                }
            ]
        },
        {
            "name": "folder-b",
            "files": [
                {
                    "name": "file-a.html"
                },
                {
                    "name": "file-b.html"
                }
            ]
        }
    ]
}

现在我在下面创建了简单的PHP代码,它可以循环遍历数组的第一部分。然后,当然如果我继续在第一个foreach内部制作foreach循环,我可以继续通过阵列。问题是我不知道数组中会有多少个文件夹/文件。关于如何在不知道循环次数的情况下如何保持循环的任何想法?谢谢!

$json = file_get_contents('build.json');

$decode = json_decode($json);

foreach($decode as $key => $val){
    foreach($val as $valKey => $data){
        var_dump($data);
    }
}

2 个答案:

答案 0 :(得分:3)

这是一个使用递归的工作脚本:

$json = file_get_contents('build.json');
$folders = json_decode($json);

function buildDirs($folders, $path = null){
  $path = $path == null ? "" : $path . "/";

  foreach($folders as $key => $val){
     mkdir($path.$val->name);
     echo "Folder: " . $path . $val->name . "<br>";

     if(!empty($val->files)){
        foreach($val->files as $file){
           //Create the files inside the current folder $val->name
           echo "File: " . $path . $val->name . "/" . $file->name . "<br>";
           file_put_contents($path . $val->name . "/". $file->name, "your data");
        }
     }

     if(!empty($val->folders)){ //If there are any sub folders, call buildDirs again!
        buildDirs($val->folders, $path . $val->name);
     }
  }
}

buildDirs($folders->folders); //Will build from current directory, otherwise send the path without trailing slash /var/www/here

请记住为根文件夹设置正确的权限。

答案 1 :(得分:1)

我还没有对下面的代码进行测试,所以如果有错误请不要开枪,但它说明了使用递归函数来解决这个问题的基本过程。我们创建一个函数,在当前级别创建一个文件夹,并向其添加任何必要的文件。如果它有子文件夹,它将调用自身,但将路径传递给新的子文件夹级别。当没有更多文件夹/文件要处理时,它就会停止,所以你不应该有无限递归的危险(就像一个无限循环)。

/**
 * @param $path   string The base path in which $folder should be created
 * @param $folder object An object that contains the content to be saved
 */
function createFileStructure( $path, $folder ) {
    // create the current folder
    $path = $path . '/' . $folder->name;
    if ( mkdir( $path . $folder->name ) ) {
        foreach ( $folder->files as $file ) touch( $path . '/' . $file->name );
    }
    // now handle subfolders if necessary
    if ( isset( $folder->folders ) ) {
        createFileStructure( $path, $folder->folders );
    }
}

// now call the above recursive function
$path = __DIR__; // set the current directory as base
$json = file_get_contents('build.json');
createFileStructure( $path, json_decode( $json ) );