За последние 24 часа нас посетили 17418 программистов и 1726 роботов. Сейчас ищут 1513 программистов ...

Как заполнить массив внутри рекурсивной процедуры

Тема в разделе "PHP для новичков", создана пользователем rc_2013, 16 мар 2013.

  1. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    Пишу скрипт под свои нужды на основании скрипта, найденного здесь http://myrusakov.ru/php-tree-dir.html. Мне нужно создать и заполнить массив названиями файлов из указанной директории.
    Проблема в том, что рекурсивная функция перебора всех каталогов и файлов не позволяет наполнять массив элемент за элементом, потому как при ее вызове самой себя массив создается заново.
    Можно, конечно, сохранить полученный список файлов в текстовый файл, по завершении работы рекурсивной функции его оттуда прочесть в массив и с ним работать, но это решение "костыльное", а хочется решить задачу, как тру-программист :)
    Может, наставите на путь истинный? Мне хотя бы ключевые слова услышать, где решение искать.

    Заранее благодарен.
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну конечно если при каждом вызове функции у вас происходит обнуление массива, то естественно он будет заполняться заново.
    А если будет вне функции то будет заполнятся дальше.
     
  3. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    Спасибо за ответ.
    Я уже пытался так сделать. Объявляю в скрипте (вне тела функции) некий массив
    Код (Text):
    1. $some_array = array ();
    в теле функции пытаюсь в него добавлять элементы таким образом:
    Код (Text):
    1. array_push($some_array, $file);
    где $file содержит имя файла.

    Но интерпретатор на этот код ругается таким образом:
    Синтаксис команды array_push соблюден, на первом месте стоит переменная массива. Чего ему еще нужно-то?
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А это точно массив?
    Проверь is_array
     
  5. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    Проверил is_array - массив.
    Еще сделал var_dump, результат:
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Массив а все равно ошибка... что ты не договариваешь, такого быть не может.

    Покажи код или попробуй без array_push просто
    Код (PHP):
    1. $some_array[] = $file; 
     
  7. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    С более простого способа добавления элемента в массив как раз начинал, а так как он не срабатывал (причем никаких warning'ов не выдавал), попробовал array_push, и в результате зашел в тупик. Вот код, может, он что-то прояснит.
    Сам по себе алгоритм перебора каталогов и файлов работает, проверено, так что дело не в нем.

    Код (Text):
    1. <?php
    2.  
    3.   header('Content-Type: text/html; charset=utf-8');
    4.  
    5.  
    6.   function showTree($folder, $space) {
    7.       /* Получаем полный список файлов и каталогов внутри $folder */
    8.     $files = scandir($folder);
    9.     foreach($files as $file) {
    10.       /* Отбрасываем текущий и родительский каталог */
    11.       if (($file == '.') || ($file == '..')) continue;
    12.       $f0 = $folder.'/'.$file; //Получаем полный путь к файлу
    13.       /* Если это директория */
    14.       if (is_dir($f0)) {
    15.         /* Выводим, делая заданный отступ, название директории */
    16.         if ($file != 'Thumbs.db')
    17.              array_push($some_array, $file);
    18.         /* С помощью рекурсии выводим содержимое полученной директории */
    19.         showTree($f0, $space.'&nbsp;&nbsp;');
    20.       }
    21.       /* Если это файл, то просто выводим название файла */
    22.       elseif ($file != 'Thumbs.db')
    23.              array_push($some_array, $file);
    24.     }
    25.   }
    26.  
    27.   # тело скрипта
    28. $some_array = array ();
    29.  
    30.   /* Запускаем функцию для текущего каталога */
    31.   showTree("D:\MyDirectory", "");
    32.  
    33.   foreach($some_array as $arr)
    34.           echo $arr.'<br>';
    35.  
    36. #if (is_array($some_array)) echo 'massiv'.'<br>';
    37. #var_dump ($some_array);
    38.  
    39. ?>
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    И где в функции showTree объявлена переменная $some_array?

    Добавлено спустя 1 минуту 12 секунд:
    Эх что то с форумом большие сообщения не добавляет или у меня проблемы...
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В начале функции напиши
    Код (PHP):
    1. global $some_array;
    после чего можешь добавлять в него элементы. Только не обнуляй и не пересоздавай этот массив заново при вызове функции.
    Интересуют подробности - читай про область видимость переменных в PHP.

    Добавлено спустя 1 минуту 26 секунд:
    Либо можешь использовать возможности ООП - создай класс, в нём создай переменную класса some_array и метод класса, который будет рекурсивно вызывать сам себя и наполнять эту переменную.

    Добавлено спустя 9 минут 27 секунд:
    Три примера. Это НЕ будет работать, как тебе нужно:
    Код (PHP):
    1. <?php
    2. $arr = array();
    3. function x() {
    4.     $arr[] = rand();
    5. }
    6. x();
    7. x();
    8. print_r($arr);
    9. ?>
    А два следующих - будут:
    Код (PHP):
    1. <?php
    2. $arr = array();
    3. function y() {
    4.     global $arr;
    5.     $arr[] = rand();
    6. }
    7. y();
    8. y();
    9. print_r($arr);
    10. ?>
    Код (PHP):
    1. <?php
    2. class y {
    3.     public $arr = array();
    4.     public function x() {
    5.         $this->arr[] = rand();
    6.     }
    7. }
    8. $y = new y();
    9. $y->x();
    10. $y->x();
    11. print_r($y->arr);
    12. ?>
     
  10. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    Спасибо, как раз это мне и было нужно. Теперь заработало!
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А что додуматься нельзя было, что у функции другая область видимости и прежде чем использовать в теле функции переменные из вне, нужно сделать приглашение...

    А не додумались вы потому, что не читали мануал.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Your, релакс, тейк ит изи))) злойнедобрый какой-то стал))) может это наша образовательная система виновата - преподают базисы вроде бейсика или фортрана. с целью алгоритмизацию преподать. ну это да, варианты простые, быстрые и легкие. в основном для преподавателя. а ученика не готовит к тому с чем он столкнется по жизни.
     
  13. rc_2013

    rc_2013 Активный пользователь

    С нами с:
    30 янв 2013
    Сообщения:
    9
    Симпатии:
    0
    Есть два варианта обучения программированию:
    1. прочитать всю теорию, потом начать кодить на практике; как раз к тому времени забудешь теорию и увлекательный процесс программирования превратится в умопомрачительный эпизод;
    2. изучать теорию и параллельно кодить, применяя то, что уже освоил на данный момент.

    Какой вариант предпочтительнее?

    А теорию я изучаю по 2-му изданию 'PHP5' Котерова. Просто еще не дошел до 14-й главы, где как раз про области видимости.
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    освоить алгоритмизацию программирования и тогда честно говоря похеру какой ЯП использовать - знаешь что нужно, находишь в мане инструмент решения задачи и все готово.