PHP遞迴建立多級目錄,php遞迴
我的第一個感覺就是用遞迴建立,具體思路如下:
function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目錄是否已經存在或嘗試建立,加一個@抑制符號是因為第一次建立失敗,會報一個“父目錄不存在”的警告。 echo $dir."建立成功
"; //輸出建立成功的目錄 }else{ $dirArr=explode('/',$dir); //當子目錄沒建立成功時,試圖建立父目錄,用explode()函數以'/'分隔字元切割成一個數組 array_pop($dirArr); //將數組中的最後一項(即子目錄)彈出來, $newDir=implode('/',$dirArr); //重新組合成一個檔案夾字串 Directory($newDir); //試圖建立父目錄 if(@mkdir($dir,0777)){ echo $dir."建立成功
"; } //再次試圖建立子目錄,成功輸出目錄名 }}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."建立成功
"; }else{ Directory(dirname($dir)); if(@mkdir($dir,0777)){ echo $dir."建立成功
"; } }}
效果一樣。
之後我在在網上搜一下答案,找到一個異常精闢的:
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遞迴建立多級目錄面試題目,以後小編會再找些有意思的面試題跟大家分享。
http://www.bkjia.com/PHPjc/1068826.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1068826.htmlTechArticlePHP遞迴建立多級目錄,php遞迴 我的第一個感覺就是用遞迴建立,具體思路如下: function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目...