算法 - 用php创建文件碰到点问题
PHP中文网
PHP中文网 2017-04-11 09:59:58
[PHP讨论组]

需求如下:

$fileArr = array(
    'Application'=>array(
        'Common'=>'functions.php',
        'Home'=>array(
            'Controller'=>'IndexController.class.php',
            'Model'=>'IndexModel.class.php',
            'View'=>array(
                'Index'=>'index.php',
            )
        ),
        'Config'
    )
);

按照以上目录结构生成相对应的文件结构.
我的函数如下:

/**
     * 生成文件  不支持纯数字目录名称
     * @param mixed $fileArr 数组或字符串(文件名或目录名)
     * eg: $fileArr = array('dir1'=>'1.html','dir2'=>array('subdir1'=>'2.html','subdir2'=>'3.html','4.html'))
     * 生成的文件路径层级如下
     * --dir1--1.html
     *   |
     *   dir2--subdir1--2.html
     *       |
     *        -subdir2--3.html
     *       |
     *        -4.html
     */
    public static function create($path,$files)
    {
        if(!is_dir($path))
        {
            exit('请输入正确的路径名称.
报错信息来自:'.__FILE__.'第'.__LINE__.'行'); } $path = str_replace('\\','/',$path); //替换斜杠 if(strrpos($path,'/')!=strlen($path)) { //检查$path,是否有末尾的'/',若没有则自动添加 $path .= '/'; } if( empty($files)) { exit('没有指定创建任何文件.
报错信息来自:'.__FILE__.'第'.__LINE__.'行'); } if(!is_readable($path)) { exit('您对['.$path.']目录不具有写入权限,写入失败
报错信息来自:'.__FILE__.'第'.__LINE__.'行'); } if(is_string($files)) { //若传递字符串则直接创建 $file = $path.$files; if(self::hasExt($files)) { fopen($file,'wb'); } else { mkdir($file); } return; } if(is_array($files)) { foreach ($files as $key => $item) { if(self::hasExt($key)) { exit($key.'键名不能是文件'); } if(self::hasExt($item)) { //如果有后缀,说明$item是文件. 创建后返回. if(is_numeric($key)) { //$key若是纯数字,自动判断为在当前目录下创建该文件 $file = $path.$item; if(file_exists($file)) { exit('目录中文件已存在'.$file.',写入失败.
报错信息来自:'.__FILE__.'第'.__LINE__.'行'); } fopen($file,'wb'); //创建文件 } else { //$key若不是纯数字,先创建目录,再创建文件 $new_path = $path.$key; mkdir($new_path); $new_file = $new_path.'/'.$item; fopen($new_file,'wb'); } } else { //如果$item没后缀,说明是目录,创建目录并递归 if(is_string($key)) { $path = $path.$key; mkdir($path); } self::create($path,$item); } } } } /** * 判断文件名称是否有后缀 * @param string $file * @return bool 有后缀返回true,否则返回false. */ public static function hasExt($file) { if(!is_string($file)) return false; return is_bool(strpos($file,'.'))? false : true; }

执行上述代码:

File::create(__DIR__.'/',$fileArr);

最终生成的文件结构有点差别, 求找bug..

PHP中文网
PHP中文网

认证0级讲师

全部回复(1)
伊谢尔伦

解决了, 循环里改变了path的值,忘记保存了.又精简了代码

    /**
     * 生成文件  不支持纯数字目录名称
     * @param string $path
     * @param array $files
     * eg: $fileArr = array('dir1'=>'1.html','dir2'=>array('subdir1'=>'2.html','subdir2'=>'3.html','4.html'))
     * 生成的文件路径层级如下
     * --dir1--1.html
     *   |
     *   dir2--subdir1--2.html
     *       |
     *        -subdir2--3.html
     *       |
     *        -4.html
     */
    public static function create($path,array $files)
    {
        //1. 数字键值,字符串文件名  array('config')
        //2. 数字键值,字符串文件目录 array('test.html')
        //3. 字符串键值,字符串文件名  array('test'=>'test.txt')
        //4. 字符串键值,字符串文件目录 array('test'=>'test1')
        //5. 字符串键值,数组文件目录 array('test'=>array('test1'));
        $path = str_replace('\\','/',$path);   //替换斜杠
        if(strrpos($path,'/')!=strlen($path)-1)
        {  //检查$path,是否有末尾的'/',若没有则自动添加
            $path .= '/';
        }

        foreach ($files as $key=>$item)
        {
            $temp = $path;
            if(!is_numeric($key))
            {
                $path .= $key;
                mkdir($path);
            }
            if(is_string($item))
            {
                $file = $path.'/'.$item;
                if(self::hasExt($item))
                {
                    fopen($file,'wb');
                }else{
                    mkdir($file);
                }
            }
            if(is_array($item))
            {
                self::create($path,$item);
            }
            $path = $temp;
        }
    }

    /**
     * 判断文件名称是否有后缀
     * @param string $file
     * @return bool 有后缀返回true,否则返回false.
     */
    public static function hasExt($file)
    {
        if(!is_string($file)) return false;
        return is_bool(strpos($file,'.'))? false : true;
    }
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号