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
Форумы портала PHP.SU :: Версия для печати :: Функция с рекурсией
Форумы портала PHP.SU » PHP » Программирование на PHP » Функция с рекурсией

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

1. Devel Fish - 24 Ноября, 2010 - 10:50:07 - перейти к сообщению
Есть функция которая возвращает масив ключами которого есть имена файлов, а значениями пути к этим файлам.
Параметры функции:
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(). Проверил функция ничего не возвращает - почему?
2. Варяг - 24 Ноября, 2010 - 11:24:56 - перейти к сообщению
потомучто нет данных для работы цикла
сделайте проверку, если файлов в директории нету - то выводить сообщение: файлов нет
3. Мелкий - 24 Ноября, 2010 - 11:27:29 - перейти к сообщению
phpfaq.ru/debug
4. Devel Fish - 24 Ноября, 2010 - 11:47:37 - перейти к сообщению
phpfaq.ru/debug - не понял что конкрктно там есть чего я не учел?

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

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

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

?

И как сделать чтобы функция возвращала хоя бы пустой масив?
5. Мелкий - 24 Ноября, 2010 - 11:51:25 - перейти к сообщению
Devel Fish пишет:
А куда девается масив

Очевидно, вы его переопределяете глобальной, но неопределённой переменной в строке 5. Зачем она там вообще? Да и 17-ая строка бессмысленна.
6. Devel Fish - 24 Ноября, 2010 - 12:01:51 - перейти к сообщению
Мелкий пишет:
Очевидно, вы его переопределяете глобальной, но неопределённой переменной в строке 5. Зачем она там вообще? Да и 17-ая строка бессмысленна.


Спасибо разобрался Радость , просто думал что глобал просто делает переменную глобальной и не переопределяет ее Язычок
7. JustUserR - 24 Ноября, 2010 - 17:43:12 - перейти к сообщению
Devel Fish Разделение использования переменных в языке PHP обеспечивается исключительно возможносью локальной област видимости для заданного вызова функции а также дифференциацией пространства имен при использовании оператора расширения области видимости - таким образом приведенное вами объявление переменное может быть целесообразным в аналогичной ситураци при операторе local для сохранения контекста
8. Devel Fish - 25 Ноября, 2010 - 17:20:58 - перейти к сообщению
JustUserR пишет:
при операторе local для сохранения контекста

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

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

Небуду утверждать но возможно если нету такой переменой то php её создаст.
ЗЫ. global нужно поменьше использовать, оно неплохо тормозит скрипт. Лутше передавать эту переменую как параметр.
10. Devel Fish - 25 Ноября, 2010 - 21:30:07 - перейти к сообщению
OrmaJever пишет:
Небуду утверждать но возможно если нету такой переменой то php её создаст.


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

видим браузере:
Переменная $a НЕ существует
11. OrmaJever - 25 Ноября, 2010 - 22:44:13 - перейти к сообщению
Ну значит просто молчит. А вы хотите чтобы при заходе на ваш сайт вылазила куча ошибок?
12. JustUserR - 26 Ноября, 2010 - 14:39:54 - перейти к сообщению
Devel Fish Интерпретатор PHP-приложений в действительности осуществляется создание переменной с целевым идентификатром в заданном пространстве имен и лексической области видимости - при обеспечении выполнения оператора который реализует считавание или преобразование трактование потенциального храминого в ней значения
Тем не менее приведенный вами PHP-скрипте не обеспечивает указанных действий - поскольку в нем производится объявление ссылки на именованную переменную в операторе global - и используется блок проверки существования переменной который осуществляет реализацию исключительно этого действия
Devel Fish пишет:
Не могу найти инфу о операторе local, читал что такой есть в perl
Приведенное сентенция из вышеуказанного мной сообщения в действительности относится к языку Perl и включает краткое описание механизма хранения лексических переменных - более подробную информацю вы можете получить здесь - http://forum[dot]dklab[dot]ru/viewtopic.php?t=30481
13. Devel Fish - 26 Ноября, 2010 - 16:42:46 - перейти к сообщению
Хорошо вроде понял, но не до конца.
При error_reporting = E_ALL



- нету ошибки

но если уберем строку global $a;
получим ошибку Notice: Undefined variable
почему что изменилось?
14. AdMeen - 26 Ноября, 2010 - 20:57:26 - перейти к сообщению


в этой строке интерпретатор автоматически создает переменную а. а в строке echo $a; вы пытаетесь вывести неизвестную, нигде не объявленую переменную.
15. JustUserR - 27 Ноября, 2010 - 12:53:10 - перейти к сообщению
Devel Fish пишет:
Почему что изменилось?
Использование оператора global для предоставления доступа функционального элемента выполняемой функции к общей области видимости приложения - в действительности обеспечивает создание локальной ссылки на целевой объект посредством указания контекста искомой переменной в глобальной области соответствующего пространства имен - таким образом в действительности осуществляется исполнение оператора global $myval как конструкции $myval=&$_GLOBALS['myval'] - которая уже в явном виде предоставляет использование необъявленного ранее индекса в правой части выражения

 

Powered by ExBB FM 1.0 RC1