2009-12-14 7 views
0

У меня есть массив, в котором перечислены папки в каталоге. До сих пор я жестко кодировал имена папок, но вместо этого я думал, что могу легко создать скрипт для разбора каталога и просто назначить имя каждой папки массиву. Таким образом, я мог бы легко добавлять папки и не должны коснуться сценарий снова ...PHP динамически заполняет массив

Субъект массив создает список опций ниспадающее меню со списком каждую папку ...

В настоящее время массив жёстко, как так ...

"опция" => Array ("папка один" => "folder1", "папка два" => "folder2")),

Но я пытаюсь сделать его динамичным Based на любые папки, найденные в данном каталоге.

Вот сценарий, который я использую, чтобы разобрать каталог и вернуть имена папок в массив. Он работает нормально.

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

И вот мой первый взять на получение этих папок в массив ...

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

Но очевидно, что не работает, так как его не кормить массив правильно, я просто получить строку в моем списке вариантов ... Я уверен, что это простой шаг перехода, который мне не хватает ...

+0

@Scott, у меня есть гораздо более короткий метод, но это зависит от того, установлена ​​ли максимальная глубина. Будет ли ваша древовидная структура расти до любой глубины, или будет 3 или 4 уровня настолько глубоки, насколько это происходит? –

+0

Привет, Даг, он будет только на один уровень. –

ответ

0

Вы хотите создать массив, а не строка.

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

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

Кроме того, следует закрыть $dh перед возвратом. Теперь закрытие никогда не называется.

+0

Спасибо Mikael, именно то, что я искал! –

1

Why not just look at php.net? Он содержит несколько примеров рекурсивного каталога.

Вот один пример:

<?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; 
} 
?> 
+0

Спасибо, Стивен, я действительно хорош в списке каталогов. Вопрос моего вопроса заключается в том, как получить папки, которые моя функция создает в массиве. –

0

Вот простая функция, которая вернет массив доступных каталогов, но не рекурсивна, поскольку имеет ограниченную глубину. Мне нравится это, потому что это так просто:

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

Вы можете использовать его как это:

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

Если вы используете PHP5 +, вы могли бы scandir(), которая встроена в функцию, которая кажется сделать то, что вам нужно. Обратите внимание, что в нем перечислены все записи в папке - файлы, папки, . и .. включены.

Смежные вопросы