Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ну очень странное поведение скрипта
 
 автор: USED   (11.01.2009 в 20:47)   письмо автору
 
 

Здравствуйте.

Пишу простую рекурсию, которая возвращает 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'.' ) == || strcmp $file'..' ) ==)
                    continue;
                
$filepath $start_dir '/' $file;
                if    (    
is_dir $filepath )     ) 
                    
$files array_merge $fileslistdir $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 $filePATHINFO_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 $filePATHINFO_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)
 

вот и здесь глюк дублирования получился :)

  Ответить  
 
 автор: USED   (11.01.2009 в 21:04)   письмо автору
 
   для: xx7   (11.01.2009 в 20:58)
 

>>функция работает правильно без каких-либо глюков.
>
> В функции никак не передано значение $mod
>,а в самом нечале стоит проверка if ( $mod != DIRS )
>при непрожождении которой сразу получается return неопределённой $files
>Как такая функция может работать без глюков ?

даже если $mod оставить (чего я и сделал, сейчас его уже нет) он НЕ определен, соответственно,
( $mod != DIRS ) === TRUE ВСЕГДА

  Ответить  
 
 автор: Саня   (11.01.2009 в 21:05)   письмо автору
 
   для: 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']); // тут список файлов

  Ответить  
 
 автор: USED   (11.01.2009 в 21:14)   письмо автору
 
   для: Саня   (11.01.2009 в 21:05)
 

выдает пустую страницу :(
черт, странно все это. скрипт действительно сума сходит - заработал на момент, но после "косметического ремонта" (выравнивание и т.д., НИОДИН элемент небыл задет) - перестал работать вовсе. То выдает пустой массив, то вообще ничего не выдает.
Я уже склонен винить разработчиков денвера, php или windows'а, нежели считать скрипт неработоспособным.

  Ответить  
 
 автор: USED   (11.01.2009 в 21:18)   письмо автору
 
   для: 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'.' ) == || strcmp $file'..' ) ==)
                continue;
            
$filepath $start_dir '/' $file;
            if    (    
is_dir $filepath )     ) 
                
$files array_merge $fileslistdir $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 $filePATHINFO_DIRNAME );
}
print_r($dirs);exit('ggg');

function 
listdir $dir )
{
    
$files    =    listfiles $dir );
    
$dirs    =    array ();
    foreach ( 
$files AS $key    =>    $file )
    {
        
$dirs[$key]    =    pathinfo $filePATHINFO_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 $filePATHINFO_DIRNAME );
    }
//    $files    =    listfiles ( $dir );
    
RETURN $files;
                    
//array_unique ( $dirs )
                    //);
}


print_r listdir "D:/home/file.ru" ) ) ;


которая идет после exit, соответственно НЕ выполняется - он все равно перестает работать.
Дурдом?

  Ответить  
 
 автор: Николай2357   (11.01.2009 в 21:33)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: USED   (12.01.2009 в 15:45)   письмо автору
 
   для: Николай2357   (11.01.2009 в 21:33)
 

Ваш код вывел

 1: Файлы:<br><br>
  2: Array
  3: (
  4:     [0] => D:/home/file.ru/www/.htaccess<br>

т.е. только первый файл

  Ответить  
 
 автор: Николай2357   (12.01.2009 в 15:52)   письмо автору
 
   для: 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   (12.01.2009 в 18:59)   письмо автору
 
   для: 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?

  Ответить  
 
 автор: Николай2357   (12.01.2009 в 19:16)   письмо автору
 
   для: 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 );
?>


только заменил на свой путь к папке

  Ответить  
 
 автор: USED   (13.01.2009 в 12:20)   письмо автору
 
   для: xx7   (12.01.2009 в 19:30)
 

Странно..
Денвер переустановил, все хвосты за ним почитстил, чего только не делал - и все равно ошибка.. Ппц..

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования