Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Определение путей ко всем вложенным каталогам, не могу даже вопрос описать...
exotica  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


Доброго. Давно не заходил, с наступившим вас, счастья, здоровья, процветания.
Есть задача, получить пути ко всем возможным каталогам начиная от корня проекта, то что вы увидите ниже это просто ужасно, но это первое что пришло в голову и дает реальный результат. Глубина вложенности равня Пяти , и по коду будет ясно почему :(
public function initAllDir($visible = 'hide'){
$sep = DIRECTORY_SEPARATOR;
$path = '.'.$sep;
$adp = array();

$level1 = scandir($path);
$level1 = array_splice($level1, 2);
for($i = 0; $i < count($level1); $i++) {
if(is_dir($level1[$i])) {
$adp[] = $path.$level1[$i].$sep;

$level2 = scandir($path.$level1[$i].$sep);
$level2 = array_splice($level2, 2);
for($k = 0; $k < count($level2); $k++) {
if(is_dir($path.$level1[$i].$sep.$level2[$k].$sep)) {
$adp[] = $path.$level1[$i].$sep.$level2[$k].$sep;

$level3 = scandir($path.$level1[$i].$sep.$level2[$k].$sep);
$level3 = array_splice($level3, 2);
for($c = 0; $c < count($level3); $c++) {
if(is_dir($path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep)) {
$adp[] = $path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep;

$level4 = scandir($path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep);
$level4 = array_splice($level4, 2);
for($x = 0; $x < count($level4); $x++) {
if(is_dir($path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep.$level4[$x].$sep)) {
$adp[] = $path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep.$level4[$x].$sep;

$level5 = scandir($path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep.$level4[$x].$sep);
$level5 = array_splice($level5, 2);
for($v = 0; $v < count($level5); $v++) {
if(is_dir($path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep.$level4[$x].$sep.$level5[$v].$sep)) {
$adp[] = $path.$level1[$i].$sep.$level2[$k].$sep.$level3[$c].$sep.$level4[$x].$sep.$level5[$v].$sep;
}
}
}
}
}
}
}
}
}
}

if($visible == 'show'){
echo '<pre>'; print_r($adp);
}
}


Результатом выполнения этой функции является одномерный массив с путями:
Array
(
[0] => .\.idea\
[1] => .\application\
[2] => .\application\news\
[3] => .\application\services\
[4] => .\application\services\realcirculationtime\
[5] => .\application\services\realcirculationtime\application\
[6] => .\application\services\realcirculationtime\public\
[7] => .\application\services\realcirculationtime\public\template\
[8] => .\core\
[9] => .\core\class\
[10] => .\core\class\other\
)


Но епрст функция выглядит просто ужасно! Неговоря уже о том что глубина вложенности которую она увидит ограничена 5-ю... Подскажите в какую сторону копать?))


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 312
Пользователь №: 39616
На форуме: 3 года, 9 дней
Карма: 35




Оно есть на первой странице выдачи же: http://stackoverflow.com/a/3154060/1007620


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2788
Пользователь №: 24406
На форуме: 6 лет, 7 месяцев, 6 дней
Карма: 180




1) Открой для себя рекурсию
2) На офф сайте есть куча готовых примеров, для файлов, для директорий, в виде функций, в виде классов http://php.net/manual/ru/function.scandir.php. Только т-сссс, никому не говори smile.gif


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


Спасибо) пойду открывать wink.gif


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22919
Пользователь №: 20039
На форуме: 7 лет, 5 месяцев, 15 дней
Карма: 607




exotica
Тебе нужна рекурсия. Вызов самого себя. Функция должна сканировать и помещать информацию о файлах, если тебе попадается папка, то функция должна вызывать саму себя.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
walerus  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чтобы все !
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2281
Пользователь №: 26852
На форуме: 6 лет, 2 месяца, 7 дней
Карма: 123




exotica
Из наработок, только чуть подправить под себя
function parseDir_file($directory, $includePath = false, $recurce = false)
{
$result = array();
if (substr($directory, -1)=="/")
$directory = substr($directory, 0, -1);
if ($dh = opendir($directory))
{
while (($file=readdir($dh))!==false)
{
if (($file=='.') || ($file=='..')) continue;
if (is_dir($directory."/".$file))
{
if ($recurce)
$result = array_values(array_merge($result, self::parseDir($directory."/".$file, $includePath, $recurce)));
}
else
array_push($result, ($includePath)? $directory."/".$file : $file);
}
}

closedir($dh);
return $result;
}
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


Скажем так я продвинулся :D
public function initAllDir($folder){
$files = scandir($folder);
foreach($files as $file) {
if (($file == '.') || ($file == '..')) continue;
$current = $folder.$file.'/';

if (is_dir($current)) {
echo $current.'<br>';
$this->initAllDir($current);
}
}
}

результат:
./.idea/
./application/
./application/news/
./application/news/something/
./application/services/
./application/services/other/
./application/services/other/template/
./application/services/time/
./core/
./core/class/

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


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


Что-то забыл про поля класса совсем, и собственно вот так имеем то что нужно, только что-то тут не так:
class TestClass
{
private $_dirList = array();

public function __construct()
{

}


public function initAllDir($folder){
$files = scandir($folder);
foreach($files as $file) {
if (($file == '.') || ($file == '..')) continue;
$current = $folder.$file.'/';

if (is_dir($current)) {
$this->_dirList[] = $current;
$this->initAllDir($current);
}
}
}

public function getDirList() {
$dirlist = $this->_dirList;
return $dirlist;
}
}

Вызов для теста:
$test = new TestClass();
$test->initAllDir('./');
$myarr = $test->getDirList();
echo '<pre>'; print_r($myarr); echo '</pre>';


Результат:
Array
(
[0] => ./.idea/
[1] => ./application/
[2] => ./application/news/
[3] => ./application/news/something/
[4] => ./application/services/
[5] => ./application/services/other/
[6] => ./application/services/other/template/
[7] => ./application/services/time/
[8] => ./core/
[9] => ./core/class/
)


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22919
Пользователь №: 20039
На форуме: 7 лет, 5 месяцев, 15 дней
Карма: 607




exotica
Что не так? Вроде всё работает же.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11932
Пользователь №: 23195
На форуме: 6 лет, 9 месяцев, 29 дней
Карма: 435

Трезвый :
7 лет, 8 месяцев, 29 дней


$paths = [];

foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $object) {
if (!$object->isDir()) {
continue;
}

$paths[] = $object->getPathname() . DIRECTORY_SEPARATOR;
}

var_dump($paths);


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


Цитата
exotica
Что не так? Вроде всё работает же.

Это ощущение, когда ты изучил какой-то материал более подробно и написал скрипт, он вроде-бы работает, но ощущение что ты "лопатой по бубну постучал" вмето того чтобы написать нормальный код

Вот некоторые цифры, не показатель, но и не совсем УГ

Время выполнения с учетом создания екземпляра класса в моем варианте:
Array
(
[0] => ./.idea/
[1] => ./application/
[2] => ./application/news/
[3] => ./application/news/something/
[4] => ./application/services/
[5] => ./application/services/other/
[6] => ./application/services/other/template/
[7] => ./application/services/time/
[8] => ./core/
[9] => ./core/class/
)
0.00100016593933


Время выполнения кода предложенного Invisible вызваного прямо в index.php
Array
(
[0] => .\.idea\
[1] => .\application\
[2] => .\application\news\
[3] => .\application\news\something\
[4] => .\application\services\
[5] => .\application\services\other\
[6] => .\application\services\other\template\
[7] => .\application\services\time\
[8] => .\core\
[9] => .\core\class\
)
0.0040009021759


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16102
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 19 дней
Карма: 303

Трезвый :
6 лет, 4 месяца, 29 дней


Цитата (exotica @ 10.01.2017 - 09:25)
Вот некоторые цифры, не показатель, но и не совсем УГ

Любопыто, для чего такому скрипту скорость?


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22919
Пользователь №: 20039
На форуме: 7 лет, 5 месяцев, 15 дней
Карма: 607




exotica
Ты же не собираешься его дёргать каждую минуту. Если 1 раз в сутки он отработает 1 секунду, то в этом нет ничего страшного.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 3 месяца, 7 дней
Карма: 22

Не курю:
4 года, 2 месяца, 25 дней


twin
Цитата
Любопыто, для чего такому скрипту скорость?

inpost
Ты же не собираешься его дёргать каждую минуту. Если 1 раз в сутки он отработает 1 секунду, то в этом нет ничего страшного.


возникло непреодолимое желание написать автозагрузчик, больше конечно из-за того что шило в ж укололо , просто стало интересно, да и иногда лень писать пути к файлам даже несмотря на подсказки IDE.

Вместо записей:

include './core/config.php';
include './core/components/default.php';
include './application/services/news/example.php';
include './core/something/dir1/dir2/anydir/some.php';


Можно будет написать так:
//В индекс файле подключаем класс автолоадера и создаем его экземпляр
require_once './Loader.php';
$load = new Loader();
$load->initAllDir();
//После этого есть список всех возможных директорий от корня соответственно нет необходимости открывать и закрывать папки, достаточно проверить наличие файла используя заранее известный список возможных путей

//Далее перечисляем имена файлов получая "загрузочный массив"


$load->initLoad('config.php, default.php, example.php, some.php');
//Скрипт отыщет все файлы и подгрузит их если они будут найдены

$load->initLoad('config, default, example, some','php');
//В этом случае произойдет тоже самое, только ко всему массиву будет подставлено указанное расширение, загрузит только те файлы которые пройдут паттерн *.php или *.js или *.html и т.д

$load->initLoad('config, default, example, some','php', 'class');
//В данном случае будет подгружать вышеуказанные файлы и создавать экземпляр их класса


Вот как то так. Текущая проблема это то что нельзя давать одинаковые названия файлам...


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 312
Пользователь №: 39616
На форуме: 3 года, 9 дней
Карма: 35




Мы огорчены и разочарованы.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса