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 型なので、関数本体は次のようになります:
is_dir ( $dir ) または (Directory(dirname( $dir )) および mkdir ( $dir ) , 0777)) ;
まず、ターゲット ディレクトリが存在するかどうかを判断します。存在する場合は、 or の短絡特性に応じて、以下全体が短絡され、実行がスキップされます。ターゲットディレクトリが存在しない場合、次の関数本体が実行されます:Directory(dirname( $dir )) および mkdir ( $dir , 0777)
最初に再帰の目的を考えました。最初に再帰を実行して、その親ディレクトリ (dirname($dir)) が作成されたことを確認します。これにより、後続の mkdir() 関数は、サブディレクトリを作成して見つからないときに警告を発行しません。親ディレクトリ。再帰の深さを入力後、最も深いルートディレクトリが存在することを確認した後、ルートディレクトリから下に向かって順番にディレクトリを作成していきます。
最後に、仕事を探している人には、オンラインで大手企業の面接質問をいくつか見つけて行うことをお勧めします。結局のところ、試験はより包括的で複雑です。 -深さ 知識を学ぶときは、質問もブラッシュアップしてください。最初は機能が使い果たされるまでに何度か最適化しました。普通に。