PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面试题,要写出一个可以创建多级目录的函数:
我的第一个感觉就是用递归创建,具体思路如下:
<span style="color: #0000ff;">function</span> Directory(<span style="color: #800080;">$dir</span><span style="color: #000000;">){</span><span style="color: #0000ff;"> if</span>(<span style="color: #008080;">is_dir</span>(<span style="color: #800080;">$dir</span>) || @<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$dir</span>,0777)){ <span style="color: #008000;">//</span><span style="color: #008000;">查看目录是否已经存在或尝试创建,[email protected],会报一个“父目录不存在”的警告。</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$dir</span>."创建成功<br>"; <span style="color: #008000;">//</span><span style="color: #008000;">输出创建成功的目录</span><span style="color: #000000;"> }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #800080;">$dirArr</span>=<span style="color: #008080;">explode</span>('/',<span style="color: #800080;">$dir</span>); <span style="color: #008000;">//</span><span style="color: #008000;">当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组</span> <span style="color: #008080;">array_pop</span>(<span style="color: #800080;">$dirArr</span>); <span style="color: #008000;">//</span><span style="color: #008000;">将数组中的最后一项(即子目录)弹出来,</span> <span style="color: #800080;">$newDir</span>=<span style="color: #008080;">implode</span>('/',<span style="color: #800080;">$dirArr</span>); <span style="color: #008000;">//</span><span style="color: #008000;">重新组合成一个文件夹字符串</span><span style="color: #000000;"> Directory(</span><span style="color: #800080;">$newDir</span>); <span style="color: #008000;">//</span><span style="color: #008000;">试图创建父目录</span> <span style="color: #0000ff;">if</span>(@<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$dir</span>,0777<span style="color: #000000;">)){ </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$dir</span>."创建成功<br>"<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;">再次试图创建子目录,成功输出目录名</span><span style="color: #000000;"> }}Directory(</span>"A/B/C/D/E/F");
输出结果如图:
但是可以看得出来,写得也太麻烦了,在手册里翻看文件函数,看到一个dirname()函数,其原型如下:
string dirname ( string $path )
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。
可以稍稍地优化一下:
<span style="color: #0000ff;">function</span> Directory(<span style="color: #800080;">$dir</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_dir</span>(<span style="color: #800080;">$dir</span>) || @<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$dir</span>,0777<span style="color: #000000;">)){ </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$dir</span>."创建成功<br>"<span style="color: #000000;">; }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ Directory(</span><span style="color: #008080;">dirname</span>(<span style="color: #800080;">$dir</span><span style="color: #000000;">)); </span><span style="color: #0000ff;">if</span>(@<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$dir</span>,0777<span style="color: #000000;">)){ </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$dir</span>."创建成功<br>"<span style="color: #000000;">; } }}</span>
效果一样。
之后我在在网上搜一下答案,找到一个异常精辟的:
<span style="color: #0000ff;">function</span> Directory( <span style="color: #800080;">$dir</span><span style="color: #000000;"> ){ </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">is_dir</span> ( <span style="color: #800080;">$dir</span> ) or Directory(<span style="color: #008080;">dirname</span>( <span style="color: #800080;">$dir</span> )) and <span style="color: #008080;">mkdir</span> ( <span style="color: #800080;">$dir</span> , 0777<span style="color: #000000;">);}</span>
现在来解释一下整个函数:
先介绍一下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()函数不会创建子目录时找不到父目录发出警告。
进入递归深处后,确认最深处的根目录存在后,从根目录向下依次创建目录。
最后,建议要找工作的亲们,去网上找些大公司面试题做一下,毕竟他们考得较为综合较深,在学习知识的时候,也刷一下题,另外也一定要做一下,因为很容易眼高手低,一开始的函数,我优化了好几遍才能正常使用。
以后我也会再找些有意思的面试题跟大家分享。
如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.

세션 ID는 로그인시, 민감한 작업 전에 및 30 분마다 정기적으로 재생되어야합니다. 1. 세션 고정 공격을 방지하기 위해 로그인 할 때 세션 ID를 재생합니다. 2. 안전성을 향상시키기 위해 민감한 작업 전에 재생성. 3. 정기적 인 재생은 장기 활용 위험을 줄이지 만 사용자 경험을 평가해야합니다.

Session_SET_COOKIE_PARAMS () 함수를 통해 PHP에서 세션 쿠키 매개 변수 설정을 달성 할 수 있습니다. 1)이 기능을 사용하여 만료 시간, 경로, 도메인 이름, 보안 플래그 등과 같은 매개 변수를 설정하십시오. 2) call session_start ()를 호출하려면 매개 변수를 발효시킵니다. 3) 사용자 로그인 상태와 같은 요구에 따라 매개 변수를 동적으로 조정합니다. 4) 보안을 향상시키기 위해 안전하고 httponly 플래그 설정에주의를 기울이십시오.

PHP에서 세션을 사용하는 주요 목적은 다른 페이지간에 사용자의 상태를 유지하는 것입니다. 1) 세션은 Session_Start () 함수를 통해 시작되어 고유 한 세션 ID를 생성하고 사용자 쿠키에 저장합니다. 2) 세션 데이터는 서버에 저장되므로 로그인 상태 및 쇼핑 카트 컨텐츠와 같은 다른 요청간에 데이터를 전달할 수 있습니다.

하위 도메인 간의 세션을 공유하는 방법? 공통 도메인 이름에 대한 세션 쿠키를 설정하여 구현. 1. 세션 쿠키 도메인을 서버 측에서 .example.com으로 설정하십시오. 2. 메모리, 데이터베이스 또는 분산 캐시와 같은 적절한 세션 저장 방법을 선택하십시오. 3. 쿠키를 통해 세션 ID를 전달하면 서버는 ID를 기반으로 세션 데이터를 검색하고 업데이트합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.
