これら 2 つのコードの違いを理解するのを手伝ってください。出力結果が異なるのはなぜですか?

WBOY
リリース: 2016-06-23 13:21:19
オリジナル
943 人が閲覧しました

/**
* ディレクトリ、サブディレクトリ、ファイルを走査します
* @param string $dir
* @param int $level
* *
*/

function scan_dir($dir = ".",$level = 0){
//現在のパスがファイルであるかどうかを判断し、ファイルである場合は直接返します
static $arr = array() ;
if(!is_dir($dir)){
$arr[] = array(
'file' => $dir,
'level' => $level,
'type' => ; 'ファイル'
); //エコー ''.$dir.' .'
' }
/ /2ディレクトリリソースを開く
$resorc = opendir($dir);
if(!$resorc){
exit('ディレクトリを開くことができませんでした')
}

//3 ディレクトリをループします
while ($file = readdir) ($resorc) ){

//var_dump($file); die();
//除外します。
if ($file ==='.' || $file ==='..' ){
/ /何もしない
}else{
//それ以外の場合はファイルまたはフォルダーです
//完全なパスを構成します
$path = $dir.'/'.$file
//var_dump($path); ; exit();
//ファイルかどうかを判断します
if(is_file($path)){
var_dump($path);echo '1
'
//ファイルを出力します
[ ] = array(
'file' => $file,
'level' => $level,
'type' => 'file'
);

//echo str_repeat("  " ,$ level).''.$file.''.'
;
}else {
//出力フォルダ名
$arr [ ] = array(
'dir' => $dir,
'level' => $level,
'type' => 'dir'
//echo str_repeat("  ") , $level).''.$dir.''.'

//それ以外の場合は、関数を呼び出します再帰的に現在走査しているディレクトリを走査します

scan_dir($path,$level+1)

}
}

}
return $arr;

}
$arr = scan_dir(); > ;';
//var_dump($arr);
foreach ($arr as $value){
if($value['type'] == 'file'){
//var_dump($value['file ' ]);
echo str_repeat("  ",$value['level']).''.$value['file'].' < ;br/>';
}else{
echo str_repeat("  ",$value['level']).''.$value['dir ' ].'
';
}
}
は、現在のディレクトリとサブディレクトリのファイル名とディレクトリ名です
digui.php
a。 .php
./ sbuscan // このディレクトリの下には出力されない subc というディレクトリもありますが、この subc ディレクトリの下にある subc.php ファイルが出力されます
subc.php
test.txt


を見てください。以下のコードは、ほぼ書かれたとおりに実行します。
function myScandir($dir = ".",$level = 0){
//走査されたすべてのファイルとフォルダーを保存し、親子関係を区別できるようにします
static $arr = array(); //1 . 現在のパスがディレクトリであるかどうかを判定し、そうでない場合は現在のファイルを直接返します
if(!is_dir($dir)){
//現在のファイルを青色で出力します
//echo '' . $dir . '
';
//現在のファイルがどのレベルに属しているかを区別するために、$level を使用して記録します
$arr[] = array( 'level' => $level,'filename' => $dir,'type' => 'file'); //return は必ずしも値を返す必要はありません
; }

//2. ディレクトリリソースの取得
$o = opendir($dir)

//ディレクトリオープン失敗処理
if(!$o){
exit('ディレクトリオープン失敗');
//3. ディレクトリをループします
while($filename = readdir($o)){
// . フォルダーと .. フォルダーを削除します
if($filename == '.' || $filename == '..'){
//何をすべきか'どちらも実行しません
}else{
//コアコード
//通常のファイル: フォルダーまたはファイルの可能性があります
//20140622/son
//現在走査されているファイルを完全なパスに結合します
$file_dir = $dir . '/' . $filename;

// ファイルの種類を決定します
if(is_file($file_dir)); echo '2
';これはファイルです
//複数のスペースを繰り返し出力するには str_repeat() を使用します
//echo str_repeat("  ",$level),'' 。
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'file') ;
}else{
//現在のフォルダー名を出力します
//echo str_repeat("  ",$level),'' ;
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'dir'); //はファイル パスであり、詳細な探索のために入力する必要があります
// 自分自身を再帰的に呼び出し、現在探索しているディレクトリへのパスを変更します
myScandir($file_dir,$level + 1)
// var_dump($file_dir ;変数受け取りは定義できません(意味不明)
$arr = myScandir();

//配列をトラバースし、ファイルを青、フォルダーを赤の配列で出力し、親子関係を明確に区別します
foreach($arr as $value){
//各 $value は、ファイルかフォルダーかに関係なく、ファイルが属する特定のレベルを表します
if($value['type'] == 'dir'){
//現在のファイルはフォルダーです
echo str_repeat ("  ",$value['level']),'' '
';
}else{
//これはファイルです
echo str_repeat("  ",$value['level']),'' . $value['filename '] '
'
}
}

これが私が望む結果です。 php
sbuscan
a.php
sbuc // ここに subc ディレクトリの出力が来ています。なぜ上記のコードには出力がないのですか?
subc.php
test.txt












ディスカッションに返信 (解決策)

デバッグ情報を追加します

      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1<br/>';        //输出文件        $arr[] = array('path' => $path,          'file'  => $file,          'level' => $level,          'type'  => 'file'          );        //echo str_repeat("  ",$level).'<font color = "blue">'.$file.'<font>'.'<br/>' ;      }else {        //输出文件夹名字        $arr[] = array('path' => $path,          'dir'  => $dir,          'level' => $level,          'type'  => 'dir'          );        //echo str_repeat("  ",$level).'<font color = "red">'.$dir.'<font>'.'<br/>' ;        //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录        scan_dir($path,$level+1);      }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
最後に printr($arr);問題がどこにあるのかがわかります

デバッグ情報

      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1<br/>';        //输出文件        $arr[] = array('path' => $path,          'file'  => $file,          'level' => $level,          'type'  => 'file'          );        //echo str_repeat("  ",$level).'<font color = "blue">'.$file.'<font>'.'<br/>' ;      }else {        //输出文件夹名字        $arr[] = array('path' => $path,          'dir'  => $dir,          'level' => $level,          'type'  => 'dir'          );        //echo str_repeat("  ",$level).'<font color = "red">'.$dir.'<font>'.'<br/>' ;        //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录        scan_dir($path,$level+1);      }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
を追加し、最後に printr($arr); を追加すると、問題が表示されます

デバッグ情報
      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1<br/>';        //输出文件        $arr[] = array('path' => $path,          'file'  => $file,          'level' => $level,          'type'  => 'file'          );        //echo str_repeat("  ",$level).'<font color = "blue">'.$file.'<font>'.'<br/>' ;      }else {        //输出文件夹名字        $arr[] = array('path' => $path,          'dir'  => $dir,          'level' => $level,          'type'  => 'dir'          );        //echo str_repeat("  ",$level).'<font color = "red">'.$dir.'<font>'.'<br/>' ;        //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录        scan_dir($path,$level+1);      }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
を追加し、最後に printr($arr); を追加すると、問題が表示されます




レベルが少しわかりにくいのですが、解決方法がわかりません。アドバイスをお願いします。ありがとう!
出力は次のとおりです。 file gt;
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート