AW: AW: Help with recursive function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Ursprüngliche Nachricht-----
> Von: Robert Stoll [mailto:php@xxxxxxxxxx]
> Gesendet: Samstag, 7. Februar 2015 19:13
> An: 'Jeffry Killen'
> Cc: 'PHP General'
> Betreff: AW: AW:  Help with recursive function
> 
> 
> > -----Ursprüngliche Nachricht-----
> > Von: Jeffry Killen [mailto:jekillen@xxxxxxxxxxx]
> > Gesendet: Freitag, 6. Februar 2015 18:38
> > An: Robert Stoll
> > Cc: 'PHP General'
> > Betreff: Re: AW:  Help with recursive function
> >
> >
> > On Feb 6, 2015, at 1:09 AM, Robert Stoll wrote:
> >
> > > Hey Jeffry,
> > >
> > >> -----Ursprüngliche Nachricht-----
> > >> Von: Jeffry Killen [mailto:jekillen@xxxxxxxxxxx]
> > >> Gesendet: Freitag, 6. Februar 2015 07:40
> > >> An: PHP General
> > >> Betreff:  Help with recursive function
> > >>
> > >> Hello again;
> > >>
> > >> I am writing a recursive file system reading method (just for the
> > >> challenge, i am re inventing a wheel)
> > >>
> > >> and I am only getting to the third level below the initial dir when
> > >> I know there is five levels below.
> > >>
> > >> I don't see why:
> > >>
> > >> private function getDirList($_dir)
> > >>                {
> > >>                 $_out = array();
> > >>                 $_valid = '';
> > >>                 $_DR = opendir($_dir);
> > >>                 while($_x = readdir($_DR))
> > >>                   {
> > >>                    switch($_x)
> > >>                      {
> > >>                       case '.':
> > >>                       case '..':
> > >>                       break;
> > >>                       default:
> > >>                       if(is_dir($_x))
> > >>                         {
> > >>                          $_valid = self::screen($_dir.'/'.$_x,
> > >> 'dir');
> > >>                          if($_valid['error'])
> > >>                            {
> > >>                             self::$_readError[count(self::
> > >> $_readError)] = $_valid['error'];
> > >>                             continue;
> > >>                            }
> > >>                          else if($_valid['pass'])
> > >>                            {
> > >>                             self::$_dirsToRead[$_dir.'/'.$_x] = true;
> > >>                             self::getDirList($_dir.'/'.$_x); ///
> > >> <<<< this should accumulate directories, shouldn't
> > > it?
> > >>                            }
> > >>                         }
> > >>                       else if(is_file)
> > >>                         {
> > >>                          continue;
> > >>                         }
> > >>                       break;
> > >>                      }
> > >>                   }
> > >>                 closedir($_DR);
> > >>                }
> > >>
> > >> thank you for time and attention
> > >> JK
> > >>
> > >> --
> > >> PHP General Mailing List (http://www.php.net/) To unsubscribe,
> > >> visit: http://www.php.net/unsub.php
> > >
> > > I do not see that you are actually doing something with the
> > > directories. You never store them in $_out nor are you returning
> > > $_out. Might this be the error? Probably you omitted some code, if
> > > so, then please provide the whole code (you could past it to
> > > 3v4l.org and provide the link) One other thing I spotted is the else if branch:
> > >
> > >  else if(is_file)
> > >
> > > should be
> > >
> > >  else if(is_file($_x))
> > >
> > > Cheers,
> > > Robert
> > >
> >
> > Thank you for pointing out the "else if(is_file)" error Also, I have
> > been in such a habit of adding $_out = array()
> that I did
> > that here but it is not being used in this method.
> >
> > The current status is that I am getting a valid list of directories
> > and no self::$_readErrors. It is just not going
> deep enough.
> >
> > This line
> > >> self::$_dirsToRead[$_dir.'/'.$_x] = true;
> > collects the directories as the code finds them.
> > It is a static member variable.
> > There is another public method that calls this method.
> >
> > public function run($_do, $_params)// $_params should be an array
> >                {
> >                 $_out = array();
> >                 // do gettype on $_params
> >                 $_stat = '';
> >                 $_argType = gettype($_params);
> >                 $_execType = gettype($_do);
> >                 if($_argType != 'array')
> >                   {
> >                    $_stat = "parameters argument must be and array:
> > but is: ".$_argType;
> >                   }
> >                 if($_execType != 'string')
> >                   {
> >                    if($_stat)
> >                      {
> >                       $_stat .= "\nexecution argument must be a string, but is ".$_execType;
> >                      }
> >                    else
> >                      {
> >                       $_stat = "execution argument must be a string, but is ".$_execType;
> >                      }
> >                   }
> >                 if($_stat)
> >                   {
> >                    $_out['error'] =  self::$_className."->run error:
> > Bad input argument type: ".$_stat;
> >                    return $_out;
> >                   }
> >                 switch($_do)
> >                   {
> >                    case 'dirList':
> >                    self::getDirList($_params['dir']);
> >                    $_out['doing'] = $_do;
> >                    $_out['dirs'] = self::$_dirsToRead;
> >                    $_out['error'] = self::$_readError;
> >                    break;
> >    //// etc... The rest of the cases are just for testing purposes at the moment.
> >         }
> >       return $_out;
> >      }
> > As you can see in the case label, self::$_dirsToRead is returned as
> > $_out['dirs']; This line in the code: $_valid = self::screen($_dir.'/'.$_x, 'dir'); checks to see if the directory
in question is
> readable and executable.
> > If not it is added to self::$_readError and skipped.
> >
> > The class def contains:
> >    // etc...
> >         private static $_readError = array();
> >         private static $_dirsToRead = array();
> >         private static $_dirsRead = array();
> >         private static $_className  = '';
> >
> >         public function __construct()
> >                {
> >                 self::$_homePath = getcwd();
> >                 self::$_className = get_class($this);
> >                }
> > // etc...
> >
> > I hope this is enough,
> > thanks for further time and attention
> > JK
> > --
> > PHP General Mailing List (http://www.php.net/) To unsubscribe, visit:
> > http://www.php.net/unsub.php[Robert Stoll] $
> 
> Hm... the only thing I can think of right now is that your directories are empty and therefore not recognised as
directories
> (is_dir returns false)
> 

Nah... ignore that it will return true if an dir is empty but the problem is in this line:

if(is_dir($_x))

It should be 
 
If(is_dir($_dir.'/'.$_x))

Hope this fixes your bug

Cheers,
Robert




-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php






[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux