|
|
|
| Здравствуйте.
Пишу простую рекурсию, которая возвращает 2 массива - в первом все папки, во втором - все файлы.
Следующим кодом получаю список файлов:
<?php
function listfiles ( $start_dir='.' )
{
if ( $mod != DIRS )
{
$files = array () ;
if ( is_dir ( $start_dir ) )
{
$fh = opendir ( $start_dir ) ;
while ( ( $file = readdir ( $fh ) ) !== false )
{
if ( strcmp ( $file, '.' ) == 0 || strcmp ( $file, '..' ) ==0 )
continue;
$filepath = $start_dir . '/' . $file;
if ( is_dir ( $filepath ) )
$files = array_merge ( $files, listdir ( $filepath ) ) ;
else
array_push ( $files, $filepath ) ;
}
closedir ( $fh ) ;
} else
{
$files = false;
}
}
return $files;
}
?>
|
функция работает правильно без каких-либо глюков.
далее хочу решить задачу вывода папок, и делаю это следующим образом:
<?php
function listdir ( $dir )
{
$files = listfiles ( $dir );
$dirs = array ();
foreach ( $files AS $key => $file )
{
$dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
}
RETURN array_unique ( $dirs );
}
?>
|
теоретически код должен вернуть все имеющиеся папки, НО почему-то он возвращает массив из N одинаковых элементов, каждый из которых - равен исходному значению $dir, а количество их равно количеству папок в $dir..
Совсем не понимаю, почему так происходит.
Делаю для проверки:
<?php
function listdir ( $dir )
{
$files = listfiles ( $dir );
$dirs = array ();
foreach ( $files AS $key => $file )
{
$dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
echo $dirs[$key] . "\n";
}
RETURN array_unique ( $dirs );
}
?>
|
выводит ВЕРНЫЙ список.
Подскажите, где и что я делаю неправильно? | |
|
|
|
|
автор: xx7 (11.01.2009 в 20:58) |
|
|
для: USED
(11.01.2009 в 20:47)
| |
e]
>функция работает правильно без каких-либо глюков.
В функции никак не передано значение $mod
,а в самом нечале стоит проверка if ( $mod != DIRS )
при непрожождении которой сразу получается return неопределённой $files
Как такая функция может работать без глю
|
>функция работает правильно без каких-либо глюков.
В функции никак не передано значение $mod
,а в самом нечале стоит проверка if ( $mod != DIRS )
при непрожождении которой сразу получается return неопределённой $files
Как такая функция может работать без глюков ? | |
|
|
|
|
автор: xx7 (11.01.2009 в 21:01) |
|
|
для: xx7
(11.01.2009 в 20:58)
| | вот и здесь глюк дублирования получился :) | |
|
|
|
|
|
|
|
для: xx7
(11.01.2009 в 20:58)
| | >>функция работает правильно без каких-либо глюков.
>
> В функции никак не передано значение $mod
>,а в самом нечале стоит проверка if ( $mod != DIRS )
>при непрожождении которой сразу получается return неопределённой $files
>Как такая функция может работать без глюков ?
даже если $mod оставить (чего я и сделал, сейчас его уже нет) он НЕ определен, соответственно,
( $mod != DIRS ) === TRUE ВСЕГДА | |
|
|
|
|
|
|
|
для: USED
(11.01.2009 в 20:47)
| | Попробуйте так:
<?
$GLOBALS['dirs'] = array();
$GLOBALS['files'] = array();
function listdir ($dir) {
$d = dir($dir);
while ( false !== ($entry = $d->read()) ) {
if ( $entry == ".." || $entry == "." ) continue;
$path = $dir."/".$entry;
if ( is_dir($path) ) {
$GLOBALS['dirs'][] = $path;
listdir($path);
} elseif ( is_file($path) ) {
$GLOBALS['files'][] = $path;
}
}
$d->close();
return true;
}
listdir(".");
print_r($GLOBALS['dirs']); // тут список папок
print_r($GLOBALS['files']); // тут список файлов
|
| |
|
|
|
|
|
|
|
для: Саня
(11.01.2009 в 21:05)
| | выдает пустую страницу :(
черт, странно все это. скрипт действительно сума сходит - заработал на момент, но после "косметического ремонта" (выравнивание и т.д., НИОДИН элемент небыл задет) - перестал работать вовсе. То выдает пустой массив, то вообще ничего не выдает.
Я уже склонен винить разработчиков денвера, php или windows'а, нежели считать скрипт неработоспособным. | |
|
|
|
|
|
|
|
для: USED
(11.01.2009 в 21:14)
| | Оригинал скрипта (который все-таки заработал даже)
<?php
function listfiles ( $start_dir='.' )
{
$files = array () ;
if ( is_dir ( $start_dir ) )
{
$fh = opendir ( $start_dir ) ;
while ( ( $file = readdir ( $fh ) ) !== false )
{
if ( strcmp ( $file, '.' ) == 0 || strcmp ( $file, '..' ) ==0 )
continue;
$filepath = $start_dir . '/' . $file;
if ( is_dir ( $filepath ) )
$files = array_merge ( $files, listdir ( $filepath ) ) ;
else
array_push ( $files, $filepath ) ;
}
closedir ( $fh ) ;
} else
{
$files = false;
}
return $files;
}
$files = listfiles ( "D:/home/file.ru" );//print_r($files);exit('ggg');
$dirs = array ();
foreach ( $files AS $key => $file )
{
$dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
}
print_r($dirs);exit('ggg');
function listdir ( $dir )
{
$files = listfiles ( $dir );
$dirs = array ();
foreach ( $files AS $key => $file )
{
$dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
}
// $files = listfiles ( $dir );
RETURN $files;
//array_unique ( $dirs )
//);
}
print_r ( listdir ( "D:/home/file.ru" ) ) ;
|
а вот когда убираю часть
<?
function listdir ( $dir )
{
$files = listfiles ( $dir );
$dirs = array ();
foreach ( $files AS $key => $file )
{
$dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
}
// $files = listfiles ( $dir );
RETURN $files;
//array_unique ( $dirs )
//);
}
print_r ( listdir ( "D:/home/file.ru" ) ) ;
|
которая идет после exit, соответственно НЕ выполняется - он все равно перестает работать.
Дурдом? | |
|
|
|
|
|
|
|
для: USED
(11.01.2009 в 21:18)
| | Чесно говоря лень разбираться, к тому жк в соседней теме то же самое. Попробуйте так:
<?
$files = array();
$dirs = array();
function find_new($dir)
{
global $files, $dirs;
$new_dir = null;
$dir_files = opendir($dir);
while(false !== ($file = readdir($dir_files)))
{
if($file != '.' && $file != '..')
$new_dir[] = $dir."/".$file;
}
if($new_dir)
foreach($new_dir as $check )
{
if(is_file($check))
{
$files[] = $check."<br>\r\n";
}
elseif(is_dir($check))
{
$dirs[] = $check."<br>\r\n";
find_new($check);
}
}
}
find_new("D:/home/file.ru");
echo "Файлы:<br><br>\r\n";
print_r($files);
echo "<br><br>\r\nДиректории:<br>\r\n";
print_r($dirs);
?>
|
| |
|
|
|
|
|
|
|
для: Николай2357
(11.01.2009 в 21:33)
| | Ваш код вывел
1: Файлы:<br><br>
2: Array
3: (
4: [0] => D:/home/file.ru/www/.htaccess<br>
|
т.е. только первый файл | |
|
|
|
|
|
|
|
для: USED
(12.01.2009 в 15:45)
| | Ну просто попробуйте. Я ж не знаю, как и в чем Вы смотрите:
<?
if(is_file($check))
{
$files[] = $check;
}
elseif(is_dir($check))
{
$dirs[] = $check;
find_new($check);
}
|
| |
|
|
|
|
автор: xx7 (11.01.2009 в 21:21) |
|
|
для: USED
(11.01.2009 в 21:14)
| | $dirs[$key] = pathinfo ( $file, PATHINFO_DIRNAME );
}
RETURN array_unique ( $dirs );
pathinfo() возвращает массив
проверяйте значения переменных, например с помощью print_r() | |
|
|
|
|
автор: xx7 (11.01.2009 в 21:46) |
|
|
для: xx7
(11.01.2009 в 21:21)
| | Описание
array pathinfo ( string path [, int options] )
pathinfo() возвращает ассоциативный массив, который содержит информацию о пути path. Возвращаемый массив состоит из следующих элементов: dirname, basename и extension.
Вы можете указать, какие элементы будут возвращены при помощи необязательного параметра options. Он состоит из PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME (появилась в PHP 5.2.0). По умолчанию возвращаются все элементы.
Обманули в мануале :))
возвращается строка , и даже не написали про это :)
Почему именно нужно сначала получить массив всех файлов , а потом извлекать пути к ним и делать array_unique() ???
не просще-ли просто сделать одну функцию которая будет возвращать то что нужно взависимости от того как вызвать. | |
|
|
|
|
|
|
|
для: USED
(11.01.2009 в 20:47)
| | Вообще весело, что скажешь..
Вот рабочий код:
<?php
function find ( $dir )
{
$files = array ();
$dirs = array ();
$open = opendir ( $dir );
while ( $one = readdir ( $open ) )
{
if ( is_file ( $dir . "/" . $one ) )
{
$GLOBALS['files'][] = $dir . "/" . $one;
}
elseif ( is_dir ( $dir . "/" . $one ) AND $one != "." AND $one != ".." )
{
$GLOBALS['dirs'][] = $dir . "/" . $one;
find ( $dir . "/" . $one );
}
}
//RETURN array ( $dirs, $files );
}
$a = find ( "D:/home/file.ru" );
$files = $GLOBALS['files'];
$dirs = $GLOBALS['dirs'];
//echo "Файлы:<br><br>\r\n";
print_r ( $files );
//echo "<br><br>\r\nДиректории:<br>\r\n";
print_r ( $dirs );
?>
|
Попробуйте раскомментировать строку
//echo "Файлы:<br><br>\r\n";
или
//echo "<br><br>\r\nДиректории:<br>\r\n";
что это? баг PHP? | |
|
|
|
|
|
|
|
для: USED
(12.01.2009 в 18:59)
| | У меня норм всё... | |
|
|
|
|
автор: xx7 (12.01.2009 в 19:30) |
|
|
для: USED
(12.01.2009 в 18:59)
| | Нормально работает ,) а что не так ?
<pre><?php
function find ( $dir )
{
global $files;
global $dirs;
$open = opendir ( $dir );
while ( $one = readdir ( $open ) )
{
if (is_file ($dir . "/" . $one))
{
$files[] = $dir . "/" . $one;
}
else if (is_dir ($dir . "/" . $one) AND $one != "." AND $one != ".." )
{
$dirs[] = $dir . "/" . $one;
find ( $dir . "/" . $one );
}
}
} // end of function
$files = array ();
$dirs = array ();
find ('/home/new/www' );
echo "Файлы:<br><br>\r\n";
print_r ( $files );
echo "<br><br>\r\nДиректории:<br>\r\n";
print_r ( $dirs );
?>
|
только заменил на свой путь к папке | |
|
|
|
|
|
|
|
для: xx7
(12.01.2009 в 19:30)
| | Странно..
Денвер переустановил, все хвосты за ним почитстил, чего только не делал - и все равно ошибка.. Ппц.. | |
|
|
|