Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблемма с рефлексией

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Okula
Отправлено: 31 Марта, 2011 - 20:08:46
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Возникла проблемма при написании функции. Возникла проблема, сжирает всю память и сервер ложится.
Можете подсказать в чём проблемма.
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Описание функции:
  3.  * Функция для сканирования каталогов неограниченной вложенности.
  4.  *
  5.  * @param string $pach путь до каталога
  6.  * @param array $file массив для сравнения с реальными файлами
  7.  * @return array возвращает массив с записями о реальных файлах которых нет в массиве $file
  8.  *
  9.  * константа FORMAT сожерхит в себе строку с разрешёнными форматами файлов, для сканирования, через запятую
  10.  * константа ST_DIR содержит папку в которой лежат все файлы (родительская папка) она при сравнении не учитывается
  11.  */
  12. function nscandir($pach, $file) {
  13.     $n_f = array();
  14.     $inf = scandir(ST_DIR."/".$pach);
  15.     foreach($inf as $value) {
  16.         $ext = substr(strrchr($value, "."), 1);
  17.         if(in_array($ext, explode(",", FORMAT)) == TRUE) {
  18.             if(in_array($pach."/".$value, $file) == FALSE) $n_f[] = $pach."/".$value;
  19.         }
  20.         if(is_dir(ST_DIR."/".$pach."/".$value) == TRUE) { nscandir($pach."/".$value, &$file); }
  21.     }
  22.     return $n_f;
  23. }

(Отредактировано автором: 31 Марта, 2011 - 20:23:07)

 
 Top
grefon
Отправлено: 31 Марта, 2011 - 20:26:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


Помог: 32 раз(а)




Скорей всего потому что вы не создали условие для каталогов с именем "." и "..". Из за этого сканирование происходит самого себя до бесконечности.
(Добавление)
Кстати Вы часом рефлексии с рекурсией не перепутали Хм


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
Мелкий Супермодератор
Отправлено: 31 Марта, 2011 - 20:30:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Не вижу отфильтровки директорий "." и ".."


-----
PostgreSQL DBA
 
 Top
Okula
Отправлено: 31 Марта, 2011 - 20:38:52
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




grefon пишет:
Кстати Вы часом рефлексии с рекурсией не перепутали

да как бы нет Улыбка
Рефлексия - обращения субъекта на самого себя. (термин не совсем для программирования но смысл тот же)
Мелкий пишет:
Не вижу отфильтровки директорий "." и ".."

да, упустил Улыбка
Исправил, теперь функция имеет такой вид
PHP:
скопировать код в буфер обмена
  1. function nscandir($pach, $file) {
  2.     $n_f = array();
  3.     $inf = scandir(ST_DIR."/".$pach);
  4.     foreach($inf as $value) {
  5.         if ($value == '.' or $value == '..') continue;
  6.         $ext = substr(strrchr($value, "."), 1);
  7.         if(in_array($ext, explode(",", FORMAT)) == TRUE) {
  8.             if(in_array($pach."/".$value, $file) == FALSE) $n_f[] = $pach."/".$value;
  9.         }
  10.         if(is_dir(ST_DIR."/".$pach."/".$value) == TRUE) { nscandir($pach."/".$value, &$file); }
  11.     }
  12.     return $n_f;
  13. }

Но почему-то дальше папки, указанной в константе ST_DIR, она не записывает данные в массив.
 
 Top
grefon
Отправлено: 31 Марта, 2011 - 20:40:31
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


Помог: 32 раз(а)




Okula пишет:
PHP:
скопировать код в буфер обмена
  1. if ($value == '.' or $value == '..') continue;

На оборот!


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
Okula
Отправлено: 31 Марта, 2011 - 20:54:39
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




grefon, всмысле наоборот?
 
 Top
grefon
Отправлено: 31 Марта, 2011 - 20:58:40
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


Помог: 32 раз(а)




Ну Вы проверяете имя директории и продалжаете только если это она сама. Нужно наоборот:
PHP:
скопировать код в буфер обмена
  1. if ($value != '.' and $value != '..') continue;


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
Okula
Отправлено: 31 Марта, 2011 - 21:11:48
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




grefon, так пустой массив возвращает, пробовал.
пробовал даже исключать из массива эти записи функцией array_shift()
результат тот же, дальше первой папки не двигается.
 
 Top
JustUserR
Отправлено: 31 Марта, 2011 - 21:13:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Okula пишет:
Рефлексия - обращения субъекта на самого себя. (термин не совсем для программирования но смысл тот же)
В действтельности использование предполагаемого термина в области определения рефлексионного объекта, не осуществляется требуемого сопоставления к предполагаемым описанием функционального решения оригинальной задачи, достижение которого обеспечивается на основании применение рекурсивного вызова функционального объекта в совместном базовом элементом уровне трактования
Wikipedia пишет:
В информатике, отражение или рефлексия (синоним интроспекция, англ. reflection) означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения. Парадигма программирования, положенная в основу отражения, называется рефлексивным программированием. Это один из видов метапрограммирования
В большинстве современных компьютерных архитектур программные инструкции (код) хранятся как данные. Разница между кодом и данными в том, что выполняя код, компьютеры обрабатывают данные. То есть, 'инструкции' 'выполняются', а 'данные' 'обрабатываются' так, как предписано этими инструкциями. Однако, программы, написанные с помощью некоторых языков, способны обрабатывать собственные инструкции как данные и, таким образом, выполнять рефлексивные модификации. Такие самомодифицирующиеся программы в основном создаются с помощью высокоуровневых языков программирования, использующих виртуальные машины (например, Smalltalk, скриптовые языки). Также рефлексия используется в языках с объявляемыми и/или статическими типами (например, Java, Си, ML, Haskell).


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
grefon
Отправлено: 31 Марта, 2011 - 21:25:56
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


Помог: 32 раз(а)




Сделал как мне привычно. Проверил - все работает!
PHP:
скопировать код в буфер обмена
  1. $format = array("php", "jpg");
  2. $n_f = array();
  3.  
  4. function nscandir($dir) {
  5.         global $format;
  6.         global $n_f;
  7.         $dh = opendir ($dir);
  8.         while ($file = readdir($dh)) {
  9.                 if($file!="." && $file!="..") {
  10.                         $fullpath = $dir."/".$file;
  11.                         if(!is_dir ($fullpath)) {
  12.                                 $ext = substr(strrchr($file, "."), 1);
  13.                                 if(in_array($ext, $format)) $n_f[] = $fullpath;
  14.                         } else {
  15.                                 nscandir($fullpath);
  16.                         }
  17.                 }
  18.         }
  19.         closedir ($dh);
  20.         return ($n_f);
  21. }
  22.  
  23. print_r(nscandir('.'));
  24.  


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
OrmaJever Модератор
Отправлено: 31 Марта, 2011 - 21:27:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




PHP:
скопировать код в буфер обмена
  1. if(is_dir(ST_DIR."/".$pach."/".$value) == TRUE)
  2. {
  3.    $n_f[] = nscandir($pach."/".$value, &$file);
  4. }

(Отредактировано автором: 31 Марта, 2011 - 21:28:15)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 31 Марта, 2011 - 21:30:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




grefon, именно что всё верно написано. И должно быть
PHP:
скопировать код в буфер обмена
  1. if ($value == '.' or $value == '..') continue;

continue означает "завершить итерацию цикла".

Okula, в мане написано, что передача значения по ссылке должна указываться при объявлении функции: http://php.su/learnphp/?re а не при вызове функции.


-----
PostgreSQL DBA
 
 Top
grefon
Отправлено: 31 Марта, 2011 - 21:38:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


Помог: 32 раз(а)




Мелкий пишет:
continue означает "завершить итерацию цикла".

Да, Вы правы! Давненько я ими не пользовался и чета попутал назначения continue и break.


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
JustUserR
Отправлено: 31 Марта, 2011 - 21:38:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
OkulВ мане написано, что передача значения по ссылке должна указываться при объявлении функции: http://php.su/learnphp/?re а не при вызове функции.
В действительности для осуществления организации определения целевого функицонального объекта, для которого производится проведение передачи переменного объекта информационного поля на основании механизма элементных ссылок, необходимо осуществления поддержания последовательной цепи декларации потокового ссылочного параметра в пониженном базовом элементном уровне трактования


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Okula
Отправлено: 31 Марта, 2011 - 21:50:09
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




grefon пишет:
Сделал как мне привычно. Проверил - все работает!
,
по идеи ваш код пишет в массив все файлы, а мне это не нужно. Нужно писать только то чего нет в массиве $file
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB