получить подпапку и конкретное имя файла и путь

Я хотел бы извлечь из пути все подкаталоги (и под-подкаталоги) и все файлы (только с расширениями .php и .css) в (последнем подпункте) его.

Структура следующая:

my_path/sub-folder1/            // I want to get the sub folder name (and check if allowed)
sub-sub-folder1/file1.php  // I want to get the file name and path
sub-sub-folder1/file1.css  // I want to get the file name and path
sub-sub-folder2/file2.php  // ....
sub-sub-folder2/file2.css
sub-sub-folder3/file3.php
sub-sub-folder3/file3.css
my_path/sub-folder2/
sub-sub-folder1/file1.php
sub-sub-folder1/file1.css
sub-sub-folder2/file2.php
sub-sub-folder2/file2.css
sub-sub-folder3/file3.php
sub-sub-folder3/file3.css

Я знаю my_pathимя каталога О подпапке, я хочу получить только подпапку с именем (sub-folder1, sub-folder2 например). И я хотел бы получить все подпапки и внутри них и получить имя и путь к файлам .css и .php внутри него. Я не уверен, что мне понятны мои объяснения.

Моя цель — хранить всю эту информацию в массиве, например так:

$data['sub-folder-1']= array(
'sub-sub-folder1' => array(
'name' => 'file1',
'php'  => 'file1.php',
'css'  => 'file1.css',
),
'sub-sub-folder2' => array(
'name' => 'file2',
'php'  => 'file2.php',
'css' => 'file2.css',
),
...
);
$data['sub-folder-2']= array(
'sub-sub-folder1' => array(
'name' => 'file1',
'php'  => 'file1.php',
'css'  => 'file1.css',
),
'sub-sub-folder2' => array(
'name' => 'file2',
'php'  => 'file2.php',
'css'  => 'file2.css',
),
...
);

Я начал с этого кода, но у меня есть некоторые трудности, чтобы заставить его работать (и он еще не закончен), я не очень часто использую этот вид функциональности …

$dirname = 'my_path';
$findphp = '*.php';
$findcss = '*.css';
$types   = array('sub-folder1','sub-folder2');

$sub_dirs = glob($dirname.'/*', GLOB_ONLYDIR|GLOB_NOSORT);

if(count($sub_dirs)) {
foreach($sub_dirs as $sub_dir) {
$sub_dir_name = basename($sub_dir);
if (in_array($sub_dir_name,$types)) {
$sub_sub_dirs = glob($sub_dir.'/*', GLOB_ONLYDIR|GLOB_NOSORT);
if(count($sub_sub_dirs)) {
foreach($sub_sub_dirs as $sub_sub_dir) {
$php = glob($sub_sub_dir.'/'.$findphp);
$css = glob($sub_sub_dir.'/'.$findcss);
$sub_sub_dir_name =  basename($sub_sub_dir);
$data[$sub_dir_name][$sub_sub_dir_name]['type'] = $sub_dir_name;
$data[$sub_dir_name][$sub_sub_dir_name]['name'] = basename($php[0], '.php');
$data[$sub_dir_name][$sub_sub_dir_name]['html'] = $php[0];
$data[$sub_dir_name][$sub_sub_dir_name]['css']  = $css[0];
}
}
}
}
} else {
echo "Nothing was found.";
}
print_r($data);

1

Решение

Мне нравится использовать класс RecursiveDirectoryIterator. Я думаю, что это более читабельно. Этот образец позволяет вам читать все подпапки данного источника.

$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source)); // Top source directory
$iterator->setFlags(\FilesystemIterator::SKIP_DOTS); // Skip folders with dot

$allowedExtension = array('php', 'css'); // And other if needed
$skin = array();
while ($iterator->valid()) {

$extension = $iterator->getExtension(); // >= PHP 5.3.6
if ($iterator->isFile() && in_array($extension, $allowedExtension)) {
// Complete this part or change it following your needs
switch ($extension) {
case 'php':
// All your logic here
$skin[$iterator->getPath()]['name'] = $iterator->getFileName(); //eg
break;
default:
break;
}
}

$iterator->next();
}

Вы можете найти полный список доступных функций на Каталог Итератор.

Надеюсь, это поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]