本篇文章主要介紹PHP使用遞迴函數建立多層目錄,有興趣的朋友參考下,希望對大家有幫助。
具體如下:
function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告。 echo $dir."创建成功<br>"; //输出创建成功的目录 }else{ $dirArr=explode('/',$dir); //当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组 array_pop($dirArr); //将数组中的最后一项(即子目录)弹出来, $newDir=implode('/',$dirArr); //重新组合成一个文件夹字符串 Directory($newDir); //试图创建父目录 if(@mkdir($dir,0777)){ echo $dir."创建成功<br>"; } //再次试图创建子目录,成功输出目录名 } } Directory("A/B/C/D/E/F");
輸出結果如圖:
但是可以看得出來,寫得也太麻煩了,在手冊裡翻看檔案函數,看到一個dirname()函數,其原型如下:
string dirname ( string $path )
#給出一個包含有指向一個檔案的全路徑的字串,本函數傳回去掉檔案名稱後的目錄名稱。
在 Windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符號。在其它環境下是斜線(/)。
可以稍稍地優化一下:
function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ echo $dir."创建成功<br>"; }else{ Directory(dirname($dir)); if(@mkdir($dir,0777)){ echo $dir."创建成功<br>"; } } }
#效果一樣。
之後我在網路上搜一下答案,找到一個異常精闢的:
function Directory( $dir ){ return is_dir ( $dir ) or Directory(dirname( $dir )) and mkdir ( $dir , 0777); }
現在來解釋整個函數:
先介紹PHP中邏輯運算子的優先順序:&& > || > and > or,即符號型>字母型,AND型>OR型,所以函數體可以看成:
is_dir ( $dir ) or (Directory(dirname( $dir )) and mkdir ( $dir , 0777));
先判斷目標目錄是否存在,若存在,依or的短路特性,後面的整體被短路,跳過執行;若目標目錄不存在,則執行後面的函數體:
Directory(dirname( $dir )) and mkdir ( $dir , 0777)
#我考慮了
##的用意:先執行遞歸,意在確認其父目錄(dirname($dir))都已經創建完畢,使後面的mkdir()函數不會創建子目錄時找不到父目錄發出警告。
進入遞歸深處後,確認最深處的根目錄存在後,從根目錄向下依序建立目錄。 最後,建議要找工作的親們,去網上找些大公司面試題做一下,畢竟他們考得較為綜合較深,在學習知識的時候,也刷一下題,另外也一定要做一下,因為很容易眼高手低,一開始的函數,我優化了幾遍才能正常使用。 這就是一道PHP遞迴創建多層次目錄面試題目,以後小編會再找些有意思的面試題跟大家分享。
總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。
相關推薦:PHP中each及list函數的使
用技巧############PHP取得目錄下檔案######以上是PHP使用遞歸函數建立多層目錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!