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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Почему выдает ошибку при отсутствии файлов в каталогах?
Devel Fish
Отправлено: 24 Ноября, 2010 - 10:50:07
Post Id



Новичок


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


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




Есть функция которая возвращает масив ключами которого есть имена файлов, а значениями пути к этим файлам.
Параметры функции:
1 - исходная директория
2 - вносить в масив файлы только с исходной или со всех поддерикторий (по умолчанию)
PHP:
скопировать код в буфер обмена
  1.  
  2. function tree_file($dir,$only_this_dir="no")
  3. {
  4.    $a_tree_file=array("default"=>"---------");
  5.    global $a_tree_file;
  6.    $read_dir=opendir($dir);
  7.    while($element = readdir($read_dir))
  8.    {
  9.       if(is_file($dir."/".$element))
  10.       {
  11.          $a_tree_file[$element]=$dir."/".$element;
  12.       }
  13.       elseif(is_dir($dir."/".$element) && $element!="." && $element!=".." && $only_this_dir==="no")
  14.       {
  15.          tree_file($dir."/".$element);
  16.       }
  17.       else{}
  18.    }
  19.    closedir ($read_dir);
  20.    return $a_tree_file;
  21. }
  22.  
  23. foreach(tree_file('my_directory') as $key=>$val)
  24. {
  25.         echo $key.' => '.$val."<BR />\n";
  26. }
  27.  


При отсутствии файлов в каталогах выдает ошибку цыкла - Invalid argument supplied for foreach(). Проверил функция ничего не возвращает - почему?

(Отредактировано автором: 24 Ноября, 2010 - 10:53:37)

 
 Top
Варяг
Отправлено: 24 Ноября, 2010 - 11:24:56
Post Id



Новичок


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


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




потомучто нет данных для работы цикла
сделайте проверку, если файлов в директории нету - то выводить сообщение: файлов нет
 
 Top
Мелкий Супермодератор
Отправлено: 24 Ноября, 2010 - 11:27:29
Post Id



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


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


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




phpfaq.ru/debug


-----
PostgreSQL DBA
 
 Top
Devel Fish
Отправлено: 24 Ноября, 2010 - 11:47:37
Post Id



Новичок


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


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




phpfaq.ru/debug - не понял что конкрктно там есть чего я не учел?

Варяг пишет:
потомучто нет данных для работы цикла

Я это и написал.

А куда девается масив
PHP:
скопировать код в буфер обмена
  1. $a_tree_file=array("default"=>"---------");

?

И как сделать чтобы функция возвращала хоя бы пустой масив?

(Отредактировано автором: 24 Ноября, 2010 - 11:51:10)

 
 Top
Мелкий Супермодератор
Отправлено: 24 Ноября, 2010 - 11:51:25
Post Id



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


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


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




Devel Fish пишет:
А куда девается масив

Очевидно, вы его переопределяете глобальной, но неопределённой переменной в строке 5. Зачем она там вообще? Да и 17-ая строка бессмысленна.


-----
PostgreSQL DBA
 
 Top
Devel Fish
Отправлено: 24 Ноября, 2010 - 12:01:51
Post Id



Новичок


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


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




Мелкий пишет:
Очевидно, вы его переопределяете глобальной, но неопределённой переменной в строке 5. Зачем она там вообще? Да и 17-ая строка бессмысленна.


Спасибо разобрался Радость , просто думал что глобал просто делает переменную глобальной и не переопределяет ее Язычок
 
 Top
JustUserR
Отправлено: 24 Ноября, 2010 - 17:43:12
Post Id



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


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


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




Devel Fish Разделение использования переменных в языке PHP обеспечивается исключительно возможносью локальной област видимости для заданного вызова функции а также дифференциацией пространства имен при использовании оператора расширения области видимости - таким образом приведенное вами объявление переменное может быть целесообразным в аналогичной ситураци при операторе local для сохранения контекста


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Devel Fish
Отправлено: 25 Ноября, 2010 - 17:20:58
Post Id



Новичок


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


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




JustUserR пишет:
при операторе local для сохранения контекста

Не понял сказаного. Не могу найти инфу о операторе local, читал что такой есть в perl

И еще почему если обявить глобальной несуществующую переменную, то пхп не говорит об ошибке, даже при error_reporting = E_ALL
например
 
 Top
OrmaJever Модератор
Отправлено: 25 Ноября, 2010 - 20:31:46
Post Id



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


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


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




Devel Fish пишет:
И еще почему если обявить глобальной несуществующую переменную, то пхп не говорит об ошибке

Небуду утверждать но возможно если нету такой переменой то php её создаст.
ЗЫ. global нужно поменьше использовать, оно неплохо тормозит скрипт. Лутше передавать эту переменую как параметр.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Devel Fish
Отправлено: 25 Ноября, 2010 - 21:30:07
Post Id



Новичок


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


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




OrmaJever пишет:
Небуду утверждать но возможно если нету такой переменой то php её создаст.


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. global $a;
  3. if(isset($a)){echo 'Переменная $a существует';}
  4. else{echo 'Переменная $a НЕ существует';}
  5. echo $a;
  6. ?>

видим браузере:
Переменная $a НЕ существует
 
 Top
OrmaJever Модератор
Отправлено: 25 Ноября, 2010 - 22:44:13
Post Id



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


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


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




Ну значит просто молчит. А вы хотите чтобы при заходе на ваш сайт вылазила куча ошибок?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
JustUserR
Отправлено: 26 Ноября, 2010 - 14:39:54
Post Id



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


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


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




Devel Fish Интерпретатор PHP-приложений в действительности осуществляется создание переменной с целевым идентификатром в заданном пространстве имен и лексической области видимости - при обеспечении выполнения оператора который реализует считавание или преобразование трактование потенциального храминого в ней значения
Тем не менее приведенный вами PHP-скрипте не обеспечивает указанных действий - поскольку в нем производится объявление ссылки на именованную переменную в операторе global - и используется блок проверки существования переменной который осуществляет реализацию исключительно этого действия
Devel Fish пишет:
Не могу найти инфу о операторе local, читал что такой есть в perl
Приведенное сентенция из вышеуказанного мной сообщения в действительности относится к языку Perl и включает краткое описание механизма хранения лексических переменных - более подробную информацю вы можете получить здесь - http://forum[dot]dklab[dot]ru/viewtopic.php?t=30481


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Devel Fish
Отправлено: 26 Ноября, 2010 - 16:42:46
Post Id



Новичок


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


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




Хорошо вроде понял, но не до конца.
При error_reporting = E_ALL



- нету ошибки

но если уберем строку global $a;
получим ошибку Notice: Undefined variable
почему что изменилось?
 
 Top
AdMeen
Отправлено: 26 Ноября, 2010 - 20:57:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


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






в этой строке интерпретатор автоматически создает переменную а. а в строке echo $a; вы пытаетесь вывести неизвестную, нигде не объявленую переменную.

(Отредактировано автором: 26 Ноября, 2010 - 21:03:42)

 
 Top
JustUserR
Отправлено: 27 Ноября, 2010 - 12:53:10
Post Id



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


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


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




Devel Fish пишет:
Почему что изменилось?
Использование оператора global для предоставления доступа функционального элемента выполняемой функции к общей области видимости приложения - в действительности обеспечивает создание локальной ссылки на целевой объект посредством указания контекста искомой переменной в глобальной области соответствующего пространства имен - таким образом в действительности осуществляется исполнение оператора global $myval как конструкции $myval=&$_GLOBALS['myval'] - которая уже в явном виде предоставляет использование необъявленного ранее индекса в правой части выражения


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB