Php ile bir dizin ve onun alt dizinleri listelemek için nasıl

0 Cevap php

Ben (bir kullanıcı tarafından yayınlanmıştır) PHP kılavuzu web sitesinde bir örnek işlevi kullanmak için çalışılıyor. Işlevi, sunucu belirtilen bir dizindeki dosya ve / veya klasörleri tüm iç içe geçmiş bir dizi dönmek gerekiyordu.

Ben sadece php öğrenme yaşıyorum, bu yüzden ben yanlış bir şey yapıyorum ki daha olası olduğunu düşünüyorum, ve işlevi çalışmıyor daha az olasıdır. Ama aşağıda işlevi daha kolay bir yöntem varsa lütfen bana bildirin.

Ben üzerinden yineleme mümkün kulüpler ve taban yolundaki tüm dosyaları yankı, ama benim örnek alt klasörde değil dosyaları. Alt klasör olmalıdır endeksi boş ya da sadece klasör adı değil ben kullanmak parametrelere bağlı olarak bir dizi ya da olduğunu. Ben klasör adını almak mümkün iken, ben yanlış döndü is_array ile test edilmiştir.

İşte fonksiyonudur:

list_array: Bir dosya sistemi yoluna da opsiyonel olarak tüm dosyaları, sadece dizinleri veya yalnızca dosyaları içeren bir dizi döndürür

  • @ Param $ base_path dize mutlak ya da göreceli yol

  • Sonuç dan @ param $ filter_dir boolean Filtre dizinleri ($ özyinelemeli doğruysa son dizin hariç ihmal)

  • @ Param $ sonucundan boolean Filtre dosyaları filter_files

  • @ Param $ hep görmezden dosyaların dize Boru sınırlandırılmış bir dize hariç

  • Alt @ param $ özyinelemeli Boole Descend dizin?

  • @ Return $ result_list dizi iç içe dizi veya 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;
    }
    

    }

İşte ben denedim birçok şeylerden biridir. Dizi 5 element, ancak ekran sadece 4 tanesi bulunur. $ Dizi Echoing [4] boştur. Ben sadece bu noktada iç içe dizisini almak için çalışıyorum. Bunun üzerinden yineleme yapmak için kolay bir yolu var Ama eğer, herhangi bir ipucu çok takdir edilmektedir.

$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;
}

0 Cevap