PHP dinamik bir dizi doldurmamak

4 Cevap

Ben bir dizin klasörleri listeleyen bir dizi var. Şimdiye kadar, ben klasör adlarını hardcoding oldum, ama bunu yapmak yerine, ben kolayca dizini ayrıştırmak için bir komut dosyası oluşturmak ve sadece dizi her klasör adını atayın düşündüm. Bu şekilde, kolayca klasör eklemek ve tekrar komut dokunmak zorunda değil ...

Konu dizisi her klasör listeleyen bir seçenekler listesi açılan menüyü oluşturur ...

Şu anda, dizi şöyle kodlanmış ...

"Seçenekler" => array ("klasör iki" => "klasörü2" => "Folder1'ı" "bir klasör")),

Ama verilen dizinde bulduğu herşeyi klasörleri dayalı dinamik yapmaya çalışıyorum.

İşte dizini ayrıştırmak ve diziye foldernames dönmek için kullanıyorum senaryo. Bu çalışıyor.

function getDirectory( $path = '.', $level = 0 )
{
// Directories to ignore when listing output.
$ignore = array( '.', '..' );

// Open the directory to the handle $dh
$dh = @opendir( $path );

// Loop through the directory
while( false !== ( $file = readdir( $dh ) ) )
	{
	// Check that this file is not to be ignored
	if( !in_array( $file, $ignore ) )
		{
		// Show directories only
		if(is_dir( "$path/$file" ) )
			{
			// Re-call this same function but on a new directory.
			// this is what makes function recursive.
			//echo $file." => ".$file. ", ";
			// need to return the folders in the form expected by the array. Probably could just add the items directly to the array?
			$mydir2=$mydir2.'"'.$file.'" => "'.$file. '", ';
			getDirectory( "$path/$file", ($level+1) );
		}
	}
}
return $mydir2;
// Close the directory handle
closedir( $dh );
}

Ve burada diziye bu klasörleri almak benim ilk almak bulunuyor ...

$mydir = getDirectory('/images/');
"options" => array($mydir)),

Ama belli ki, bu onun doğru ben sadece benim seçenekler listesindeki bir dize almak dizi besleme değil beri ... Ben bu Kaçırdığım kolay bir dönüşüm adımdır eminim düzgün çalışmıyor ...

4 Cevap

Sen bir dizi değil, bir dize oluşturmak istiyorum.

// Replace
$mydir2=$mydir2.'"'.$file.'" => "'.$file. '", ';

// With
$mydir2[$file] = $file;

Ayrıca, yakın $dh dönmeden önce. Şimdi, closedir asla denir.

Why not just look at php.net? Bu özyinelemeli dir liste üzerinde çeşitli örnekler vardır.

İşte bir örnek:

<?php 
public static function getTreeFolders($sRootPath = UPLOAD_PATH_PROJECT, $iDepth = 0) { 
      $iDepth++; 
      $aDirs = array(); 
      $oDir = dir($sRootPath); 
      while(($sDir = $oDir->read()) !== false) { 
        if($sDir != '.' && $sDir != '..' && is_dir($sRootPath.$sDir)) { 
          $aDirs[$iDepth]['sName'][] = $sDir; 
          $aDirs[$iDepth]['aSub'][]  = self::getTreeFolders($sRootPath.$sDir.'/',$iDepth); 
        } 
      } 
      $oDir->close(); 
      return empty($aDirs) ? false : $aDirs; 
} 
?>

Burada mevcut dizinleri bir dizi döndürür basit bir fonksiyonu olduğunu, ancak bunun sınırlı bir derinliğe sahip olması recursive değildir. Bu kadar basit, çünkü ben bunu seviyorum:

<?php
  function get_dirs( $path = '.' ){
    return glob( 
      '{' . 
        $path . '/*,'    . # Current Dir
        $path . '/*/*,'  . # One Level Down
        $path . '/*/*/*' . # Two Levels Down, etc.
      '}', GLOB_BRACE + GLOB_ONLYDIR );
  }
?>

Bu gibi kullanabilirsiniz:

$dirs = get_dirs( WP_CONTENT_DIR . 'themes/clickbump_wp2/images' );

Eğer PHP5 kullanıyorsanız + Bir klasörde scandir() , which is a built-in function that seems to do pretty much what you're after. Note that it lists all girdileri gibi olabilir - eğer dosyalar, klasörler, . ve .. dahildir.