PHP динамически заполняет массив - PullRequest
0 голосов
/ 15 декабря 2009

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

Массив объектов создает выпадающее меню списка параметров, в котором перечислены все папки ...

В настоящее время массив закодирован как ...

"options" => array ("folder one" => "folder1", "folder two" => "folder2")),

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

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

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)),

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

Ответы [ 4 ]

1 голос
/ 15 декабря 2009

Почему бы просто не взглянуть на php.net ? В нем есть несколько примеров рекурсивного перечисления dir.

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

<?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 голосов
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

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

<?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 голосов
/ 15 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...