Пишу скрипт под свои нужды на основании скрипта, найденного здесь http://myrusakov.ru/php-tree-dir.html. Мне нужно создать и заполнить массив названиями файлов из указанной директории. Проблема в том, что рекурсивная функция перебора всех каталогов и файлов не позволяет наполнять массив элемент за элементом, потому как при ее вызове самой себя массив создается заново. Можно, конечно, сохранить полученный список файлов в текстовый файл, по завершении работы рекурсивной функции его оттуда прочесть в массив и с ним работать, но это решение "костыльное", а хочется решить задачу, как тру-программист Может, наставите на путь истинный? Мне хотя бы ключевые слова услышать, где решение искать. Заранее благодарен.
Ну конечно если при каждом вызове функции у вас происходит обнуление массива, то естественно он будет заполняться заново. А если будет вне функции то будет заполнятся дальше.
Спасибо за ответ. Я уже пытался так сделать. Объявляю в скрипте (вне тела функции) некий массив Код (Text): $some_array = array (); в теле функции пытаюсь в него добавлять элементы таким образом: Код (Text): array_push($some_array, $file); где $file содержит имя файла. Но интерпретатор на этот код ругается таким образом: Синтаксис команды array_push соблюден, на первом месте стоит переменная массива. Чего ему еще нужно-то?
Массив а все равно ошибка... что ты не договариваешь, такого быть не может. Покажи код или попробуй без array_push просто Код (PHP): $some_array[] = $file;
С более простого способа добавления элемента в массив как раз начинал, а так как он не срабатывал (причем никаких warning'ов не выдавал), попробовал array_push, и в результате зашел в тупик. Вот код, может, он что-то прояснит. Сам по себе алгоритм перебора каталогов и файлов работает, проверено, так что дело не в нем. Код (Text): <?php header('Content-Type: text/html; charset=utf-8'); function showTree($folder, $space) { /* Получаем полный список файлов и каталогов внутри $folder */ $files = scandir($folder); foreach($files as $file) { /* Отбрасываем текущий и родительский каталог */ if (($file == '.') || ($file == '..')) continue; $f0 = $folder.'/'.$file; //Получаем полный путь к файлу /* Если это директория */ if (is_dir($f0)) { /* Выводим, делая заданный отступ, название директории */ if ($file != 'Thumbs.db') array_push($some_array, $file); /* С помощью рекурсии выводим содержимое полученной директории */ showTree($f0, $space.' '); } /* Если это файл, то просто выводим название файла */ elseif ($file != 'Thumbs.db') array_push($some_array, $file); } } # тело скрипта $some_array = array (); /* Запускаем функцию для текущего каталога */ showTree("D:\MyDirectory", ""); foreach($some_array as $arr) echo $arr.'<br>'; #if (is_array($some_array)) echo 'massiv'.'<br>'; #var_dump ($some_array); ?>
И где в функции showTree объявлена переменная $some_array? Добавлено спустя 1 минуту 12 секунд: Эх что то с форумом большие сообщения не добавляет или у меня проблемы...
В начале функции напиши Код (PHP): global $some_array; после чего можешь добавлять в него элементы. Только не обнуляй и не пересоздавай этот массив заново при вызове функции. Интересуют подробности - читай про область видимость переменных в PHP. Добавлено спустя 1 минуту 26 секунд: Либо можешь использовать возможности ООП - создай класс, в нём создай переменную класса some_array и метод класса, который будет рекурсивно вызывать сам себя и наполнять эту переменную. Добавлено спустя 9 минут 27 секунд: Три примера. Это НЕ будет работать, как тебе нужно: Код (PHP): <?php $arr = array(); function x() { $arr[] = rand(); } x(); x(); print_r($arr); ?> А два следующих - будут: Код (PHP): <?php $arr = array(); function y() { global $arr; $arr[] = rand(); } y(); y(); print_r($arr); ?> Код (PHP): <?php class y { public $arr = array(); public function x() { $this->arr[] = rand(); } } $y = new y(); $y->x(); $y->x(); print_r($y->arr); ?>
А что додуматься нельзя было, что у функции другая область видимости и прежде чем использовать в теле функции переменные из вне, нужно сделать приглашение... А не додумались вы потому, что не читали мануал.
Your, релакс, тейк ит изи))) злойнедобрый какой-то стал))) может это наша образовательная система виновата - преподают базисы вроде бейсика или фортрана. с целью алгоритмизацию преподать. ну это да, варианты простые, быстрые и легкие. в основном для преподавателя. а ученика не готовит к тому с чем он столкнется по жизни.
Есть два варианта обучения программированию: 1. прочитать всю теорию, потом начать кодить на практике; как раз к тому времени забудешь теорию и увлекательный процесс программирования превратится в умопомрачительный эпизод; 2. изучать теорию и параллельно кодить, применяя то, что уже освоил на данный момент. Какой вариант предпочтительнее? А теорию я изучаю по 2-му изданию 'PHP5' Котерова. Просто еще не дошел до 14-й главы, где как раз про области видимости.
освоить алгоритмизацию программирования и тогда честно говоря похеру какой ЯП использовать - знаешь что нужно, находишь в мане инструмент решения задачи и все готово.