1

PHPマニュアルサイト(ユーザー投稿)のサンプル関数を使ってみました。この関数は、サーバーの指定されたディレクトリにあるすべてのファイルおよび/またはフォルダーのネストされた配列を返すことになっています。

私はPHPを学んでいるので、何か間違ったことをしている可能性が高く、関数が機能しない可能性は低いと思います. しかし、以下の機能よりも簡単な方法があれば教えてください。

ベース パス内のすべてのファイルを反復してエコーできますが、サンプル サブフォルダー内のファイルはできません。サブフォルダーがあるべきインデックスは、使用するパラメーターに応じて、空白またはフォルダー名のみであり、配列ではありません。フォルダー名を取得できたら、false を返す is_array でテストしました。

関数は次のとおりです。

list_array: オプションですべてのファイル、ディレクトリのみ、またはファイル システム パスのファイルのみを含む配列を返します

  • @param $base_path 文字列 絶対パスまたは相対パス

  • @param $filter_dir boolean 結果からディレクトリをフィルターします ($recursive が true の場合、最後のディレクトリ以外は無視されます)

  • @param $filter_files boolean 結果からファイルをフィルター

  • @param $exclude string パイプで区切られた、常に無視するファイルの文字列

  • @param $recursive boolean ディレクトリを一番下に降ろしますか?

  • @return $result_list array ネストされた配列または false

    function directory_list($directory_base_path, $filter_dir = false, $filter_files = false, $exclude = ".|..|.DS_Store|.svn", $recursive = true){
    $directory_base_path = rtrim($directory_base_path, "/") . "/";
    
    if (!is_dir($directory_base_path)){
        error_log(__FUNCTION__ . "File at: $directory_base_path is not a directory.");
        return false;
    }
    
    $result_list = array();
    $exclude_array = explode("|", $exclude);
    
    if (!$folder_handle = opendir($directory_base_path)) {
        error_log(__FUNCTION__ . "Could not open directory at: $directory_base_path");
        return false;
    }else{
        while(false !== ($filename = readdir($folder_handle))) {
            if(!in_array($filename, $exclude_array)) {
                if(is_dir($directory_base_path . $filename . "/")) {
                    if($recursive && strcmp($filename, ".")!=0 && strcmp($filename, "..")!=0 ){ // prevent infinite recursion
                        error_log($directory_base_path . $filename . "/");
                        $result_list[$filename] = directory_list("$directory_base_path$filename/", $filter_dir, $filter_files, $exclude, $recursive);
                    }elseif(!$filter_dir){
                        $result_list[] = $filename;
                    }
                }elseif(!$filter_files){
                    $result_list[] = $filename;
                }
            }
        }
        closedir($folder_handle);
        return $result_list;
    }
    

    }

これは私が試した多くのことの1つです。配列には 5 つの要素が含まれていますが、そのうちの 4 つだけが表示されます。$array[4] のエコーは空白です。この時点で、ネストされた配列を取得しようとしています。しかし、それを繰り返す簡単な方法があれば、どんなヒントでも大歓迎です。

$directory_base_path = "../sandbox/";
$filter_dir = false;
$filter_files = false;
$exclude_files = ".|..|.DS_Store|dir_read_test.php";
$recursive = true;
$array = directory_list($directory_base_path, $filter_dir, $filter_files, $exclude_files, $recursive);
$array_length = count($array);
echo $array_length;
echo "<br/>";
$count = 0;

while ( $array_length >= $count ) {
 echo $array[$count];
 echo "<br/>";
 $count = $count + 1;
}
4

1 に答える 1

4

そのルーチンをよく見てください。

    $result_list[$filename] = directory_list(/*recursive*/);
 else
    $result_list[] = $filename;

違いは何ですか?再帰エントリは index$filenameの下に配置され、直接の内容は を使用して昇順の整数インデックスの下に配置され[]ます。ループは整数インデックスのみを表示します。

もしそうなら

print_r($array);

すべてのエントリが表示されます。[$filename](または、もちろん、に置き換えることもできます[]。) それらを自分でループするには、while ループを次のように置き換えます。

foreach ( $array as $k=>$v )
{
    echo "$k: $v<br/>";
}

(サブディレクトリの場合、これは「サブディレクトリ: 配列」と表示されますが、それは別のトピックです。それis_array($v)に基づいてテストし、何らかのアクションを実行できます)

于 2010-08-11T21:25:29.680 に答える