PHP artımlı derinliği ile dizinin dinamik oluşumu

2 Cevap php

Ben ardışık bir klasörü taramak için bir işlevini kullanın ve bir dizi her bir tarama içeriğini atamak istiyorum.

Ya sonraki () veya kullanarak foreach, dizideki her ardışık dizin recurse kadar basit - ama nasıl dinamik (sert işlevi içine kodlama olmadan) dizi derinlik bir katman eklemek için bana sorun veriyor. İşte bazı sözde bulunuyor:

function myScanner($start){

    static $files = array();

    $files = scandir($start);
    //do some filtering here to omit unwanted types

    $next = next($files);


    //recurse scan

    //PROBLEM: how to increment position in array to store results
    //$next_position = $files[][][].... ad infinitum

    //myScanner($start.DIRECTORY_SEPARATOR.$next);
}

herhangi bir fikir?

2 Cevap

Böyle bir şey deneyin:

// $array is a pointer to your array
// $start is a directory to start the scan
function myScanner($start, &$array){
  // opening $start directory handle
  $handle = opendir($start);

  // now we try to read the directory contents
  while (false !== ($file = readdir($handle))) {
    // filtering . and .. "folders"
    if ($file != "." && $file != "..") {
      // a variable to test if this file is a directory
      $dirtest = $start . DIRECTORY_SEPARATOR . $file;

      // check it
      if (is_dir($dirtest)) {
        // if it is the directory then run the function again
        // DIRECTORY_SEPARATOR here to not mix files and directories with the same name
        myScanner($dirtest, $array[$file .  DIRECTORY_SEPARATOR]);
      } else {
        // else we just add this file to an array
        $array[$file] = '';
      }
    }
  }

  // closing directory handle
  closedir($handle);
}

// test it
$mytree = array();
myScanner('/var/www', $mytree);

print "<pre>";
print_r($mytree);
print "</pre>";

Bu fonksiyonu kullanmak (ve talepleri için düzenlemek) için deneyin:

function getDirTree($dir,$p=true) {
    $d = dir($dir);$x=array();
    while (false !== ($r = $d->read())) {
    	if($r!="."&&$r!=".."&&(($p==false&&is_dir($dir.$r))||$p==true)) {
    		$x[$r] = (is_dir($dir.$r)?array():(is_file($dir.$r)?true:false));
    	}
    }

    foreach ($x as $key => $value) {
    	if (is_dir($dir.$key."/")) {
    		$x[$key] = getDirTree($dir.$key."/",$p);
    	}
    }

    ksort($x);
    return $x;
}

Bu dizinleri sıralanmış dizisi döndürür.