PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面試題,要寫出一個(gè)可以創(chuàng)建多級目錄的函數(shù):
?
我的第一個(gè)感覺就是用遞歸創(chuàng)建,具體思路如下:
function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目錄是否已經(jīng)存在或嘗試創(chuàng)建,加一個(gè)@抑制符號是因?yàn)榈谝淮蝿?chuàng)建失敗,會(huì)報(bào)一個(gè)“父目錄不存在”的警告。echo $dir."創(chuàng)建成功<br>"; //輸出創(chuàng)建成功的目錄 }else{$dirArr=explode('/',$dir); //當(dāng)子目錄沒創(chuàng)建成功時(shí),試圖創(chuàng)建父目錄,用explode()函數(shù)以'/'分隔符切割成一個(gè)數(shù)組array_pop($dirArr); //將數(shù)組中的最后一項(xiàng)(即子目錄)彈出來,$newDir=implode('/',$dirArr); //重新組合成一個(gè)文件夾字符串 Directory($newDir); //試圖創(chuàng)建父目錄if(@mkdir($dir,0777)){echo $dir."創(chuàng)建成功<br>";} //再次試圖創(chuàng)建子目錄,成功輸出目錄名 }}Directory("A/B/C/D/E/F");輸出結(jié)果如圖:
?
但是可以看得出來,寫得也太麻煩了,在手冊里翻看文件函數(shù),看到一個(gè)dirname()函數(shù),其原型如下:
string?dirname?(?string?$path?)
給出一個(gè)包含有指向一個(gè)文件的全路徑的字符串,本函數(shù)返回去掉文件名后的目錄名。?
在?Windows?中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環(huán)境下是斜線(/)。
可以稍稍地優(yōu)化一下:
function Directory($dir){if(is_dir($dir) || @mkdir($dir,0777)){ echo $dir."創(chuàng)建成功<br>"; }else{Directory(dirname($dir));if(@mkdir($dir,0777)){echo $dir."創(chuàng)建成功<br>";}}}效果一樣。
?
之后我在在網(wǎng)上搜一下答案,找到一個(gè)異常精辟的:
function Directory( $dir ){ return is_dir ( $dir ) or Directory(dirname( $dir )) and mkdir ( $dir , 0777);}現(xiàn)在來解釋一下整個(gè)函數(shù):
先介紹一下PHP中邏輯運(yùn)算符的優(yōu)先級順序:&& > || > and > or,即符號型>字母型,AND型>OR型,所以函數(shù)體可以看成:
is_dir?(?$dir?)??or??(Directory(dirname(?$dir?))??and???mkdir?(?$dir?,?0777));
先判斷目標(biāo)目錄是否存在,若存在,依or的短路特性,后面的整體被短路,跳過執(zhí)行;若目標(biāo)目錄不存在,則執(zhí)行后面的函數(shù)體:
Directory(dirname(?$dir?))??and???mkdir?(?$dir?,?0777)?
我考慮了一下先進(jìn)行遞歸的用意:先執(zhí)行遞歸,意在確認(rèn)其父目錄(dirname($dir))都已經(jīng)創(chuàng)建完畢,使后面的mkdir()函數(shù)不會(huì)創(chuàng)建子目錄時(shí)找不到父目錄發(fā)出警告。
進(jìn)入遞歸深處后,確認(rèn)最深處的根目錄存在后,從根目錄向下依次創(chuàng)建目錄。
?
最后,建議要找工作的親們,去網(wǎng)上找些大公司面試題做一下,畢竟他們考得較為綜合較深,在學(xué)習(xí)知識的時(shí)候,也刷一下題,另外也一定要做一下,因?yàn)楹苋菀籽鄹呤值?#xff0c;一開始的函數(shù),我優(yōu)化了好幾遍才能正常使用。
以后我也會(huì)再找些有意思的面試題跟大家分享。
如果您覺得本博文對您有幫助,您可以推薦或關(guān)注我,如果您有什么問題,可以在下方留言討論,謝謝。
轉(zhuǎn)載于:https://www.cnblogs.com/zhenbianshu/p/4938975.html
總結(jié)
以上是生活随笔為你收集整理的PHP递归创建多级目录(一道面试题的解题过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VIJOS【1234】口袋的天空
- 下一篇: PHP动态多文件上传的具体代码