Php递归目录创建

I must create recursive directories and create a file for every folder. I want like this:

   modules/
   modules/default
   modules/default/test_module
   modules/default/test_module/a
   modules/default/test_module/a/test_module.php
   modules/default/test_module/m
   modules/default/test_module/m/test_module.php
   modules/default/test_module/c
   modules/default/test_module/c/test_module.php
   modules/root
   modules/root/test_module
   modules/root/test_module/a
   modules/root/test_module/a/test_module.php
   modules/root/test_module/m
   modules/root/test_module/m/test_module.php
   modules/root/test_module/c
   modules/root/test_module/c/test_module.php
   templates
   templates/default
   templates/default/test_module
   templates/default/test_module/test_module.tpl
   templates/root
   templates/root/test_module
   templates/root/test_module/test_module.tpl

But this code generate like this:

   |-- modules
   |   |-- default
   |   |   |-- root
   |   |   |   `-- test_module
   |   |   |       |-- a
   |   |   |       |   `-- test_module.php
   |   |   |       |-- c
   |   |   |       |   `-- test_module.php
   |   |   |       `-- m
   |   |   |           `-- test_module.php
   |   |   `-- test_module
   |   |       |-- a
   |   |       |   `-- test_module.php
   |   |       |-- c
   |   |       |   `-- test_module.php
   |   |       `-- m
   |   |           `-- test_module.php
   |   |-- root
   |   |   |-- index
   |   |   |   `-- c
   |   |   |       `-- index.php
   |   |   |-- modules
   |   |   |   |-- a
   |   |   |   |   `-- modules.php
   |   |   |   |-- c
   |   |   |   |   `-- modules.php
   |   |   |   `-- m
   |   |   |       `-- modules.php
   |   |   `-- user
   |   |       |-- a
   |   |       |   `-- user.php
   |   |       |-- c
   |   |       |   `-- user.php
   |   |       `-- m
   |   |           `-- user.php
   |   `-- templates
   |       `-- root
   |           |-- default
   |           |   `-- test_module
   |           |       `-- test_module.tpl
   |           `-- test_module
   |               `-- test_module.tpl

Code is:

    protected function createFiles($files, $parent_directory = null)
    {
        echo $parent_directory."
</br>
";
        if (!$parent_directory) {
            $parent_directory = www;
        }
        foreach ((array)$files as $key => $value) {
            if (is_array($value)) {
                if (!is_dir($parent_directory . $key)) {
                    mkdir($parent_directory . $key,0777);
                    chmod($parent_directory.$key,0777);
                }
                $parent_directory .= $key . '/';
                $this->createFiles($value, $parent_directory);
            } else {
                $parent_directory_=$parent_directory.$key . '/';
                if(!is_dir($parent_directory_)){
                    mkdir($parent_directory_,0777);
                    chmod($parent_directory_,0777);
                }
                $alias = explode('.',$value);
                $alias = $alias[0];
                $defaultAjaxContent = <<<AJAX
    <?php
       class {$alias} extends ajax{
       /**
        * Autocreated
        **/
       public function initAjax(){

       }
   }
   ?>
   AJAX;
                $file = fopen($parent_directory_.$value, 'w+');
                $write = fwrite($file, $defaultAjaxContent);
                if (!$write) {
                    throw new AjaxCatcher("{$parent_directory_}{$value} oluşturulurken beklenmedik bir hata oluştu. Lütfen tekrar deneyiniz. ");
                }
            }
        }
        //$file = fopen($files['default_ajax']);
        return 1;
    }

Reason why not use recursive mkdir :

$dirs = array();
        $dirs['modules']['default'][$alias]['a'] = $alias . ".php";
        $dirs['modules']['default'][$alias]['m'] = $alias . '.php';
        $dirs['modules']['default'][$alias]['c'] = $alias . '.php';

        $dirs['modules']['root'][$alias]['a'] = $alias . '.php';
        $dirs['modules']['root'][$alias]['m'] = $alias . '.php';
        $dirs['modules']['root'][$alias]['c'] = $alias . '.php';

        $dirs['templates']['root'][$alias] = $alias . '.tpl';
        $dirs['templates']['default'][$alias] = $alias . '.tpl';

        $this->createFiles($dirs);

thanks.

I think the mkdir with recursive is still the best idea, all you need to do is to concat the nested array keys:

    $dirs = array();
    $dirs['modules']['default'][$alias]['a'] = $alias . ".php";
    $dirs['modules']['default'][$alias]['m'] = $alias . '.php';
    $dirs['modules']['default'][$alias]['c'] = $alias . '.php';

    $dirs['modules']['root'][$alias]['a'] = $alias . '.php';
    $dirs['modules']['root'][$alias]['m'] = $alias . '.php';
    $dirs['modules']['root'][$alias]['c'] = $alias . '.php';

    $dirs['templates']['root'][$alias] = $alias . '.tpl';
    $dirs['templates']['default'][$alias] = $alias . '.tpl';

    // concat the keys (flatten the array)...
    function prefixKey($prefix, $array) {
        $result = array();
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $result = array_merge($result, prefixKey($prefix . $key . '/', $value));
            } else {
                $result[$prefix . $key] = $value;
            }
        }   
        return $result;
    }

    // this is your function, use the prefixKey function to get the required
    // pathstructure directly from your array...
    function createFiles($dirs) {
       $pathStructure = prefixKey('', $dirs);
       // here you have the flatten keys (the path), the value is the file
       foreach($pathStructure as $path => $file) {
            // use mkdir with 
            if(!is_dir($path)) {
                mkdir($path, 0777, true);
            }
            // and so on
       }

    }

Take a look at the command touch.

If you have a set list of files that you must create (with no contents), you can just iterate over your array calling it.

You will need to change your code to supply a single dimensional array of file names.

$dirs = array();
$dirs[] = "modules\default\$alias\a\$alias.php";
...
$dirs[] = "templates\default\$alias\$alias.tpl";

foreach($dirs as $file) {
    touch($file);
}

Note that there are permission related restrictions, so read up on touch if you find the files are not being created.

Also of note, you are missing fclose() in your example. You should look into file_put_contents() as it handles the fopen/fwrite/fclose for you.

You can try

class Maker {

    function createFiles($config, $path = null) {
        foreach ( $config as $k => $v ) {
            if (is_array($v)) {
                mkdir($path . DIRECTORY_SEPARATOR . $k, 0777);
                chmod($path . DIRECTORY_SEPARATOR . $k, 0777);
                $this->createFiles($v,$path . DIRECTORY_SEPARATOR . $k);
            }
            else
            {
                touch($path . DIRECTORY_SEPARATOR . $v); //create the file
            }
        }
    }
}

$alias = "test_module";
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';

$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';

$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';

$maker = new Maker();
$maker->createFiles($dirs, __DIR__ . "/test");

My resolve :

protected function createModuleFiles($alias){
        //Default kısmına php controller dosyası oluşturulacak.
        $dirs = array();
        $dirs['modules/default/'.$alias.'/a'] = $alias . ".php";
        $dirs['modules/default/'.$alias.'/m'] = $alias . '.php';
        $dirs['modules/default/'.$alias.'/c'] = $alias . '.php';

        $dirs['modules/root/'.$alias.'/a'] = $alias . '.php';
        $dirs['modules/root/'.$alias.'/m'] = $alias . '.php';
        $dirs['modules/root/'.$alias.'/c'] = $alias . '.php';

        $dirs['templates/root/'.$alias] = $alias . '.tpl';
        $dirs['templates/default/'.$alias] = $alias . '.tpl';

        $this->createFiles($dirs);

    }

protected function createFiles($files){
        foreach($files as $key=>$value){
            if(!is_dir($key)){
                mkdir(www.$key,0777,true);
            }
            chmod(www.$key,0777);
            $alias = explode('.',$value);
            $alias = $alias[0];
            $type = end(explode('/',$key));
            switch($type){
                case 'a';
                case 'c';
                case 'm';
                    $content = $this->default_contents($alias,$type);
                break;
                default:
                    $content = $this->default_contents($alias,'tpl');
                    break;
            }
            $file = fopen(www.$key.'/'.$value, 'w+');
            $write = fwrite($file, $content);
            if (!$write) {
                throw new AjaxCatcher("".www.$key.'/'.$value." an error. ");
            }

        }

        return 1;
    }