Segregowanie alfabetyczne


(Maryo) #1

witam, mam prosty skrypt wczytujący pliki pdf z katalogu. co i gdzie trzeba dopisadac, aby wyswietlane nazwy plików pdf były wyświetlane w kolejnosci alfabetycznej?

<?php

try{

    $str = '
  • '; $di = new DirectoryIterator('pdf/nowe/A4/'); foreach($di as $file) { if( !$file->isDot() && !$file->isDir() ) $str .= '
  • ['.$file->getFilename().']('.%24file-)'; } $str .= '
    '; echo $str; } catch(Exception $e) { echo $e->getMessage(); } ?>[/code]

(Airborn) #2

niestety DirectoryIterator nie dorobił się sortowania, najprościej będzie skorzystać z gotowego rozwiązania które jest w manualu link zmieniasz jedynie klasę z której dziedziczysz na DirectoryIterator a u siebie zmieniasz

$di = new DirectoryIterator('pdf/nowe/A4/');

na:

$di = new DirList ('pdf/nowe/A4/');

(Maryo) #3

czyli powinienem użyć tego skryptu?: ale gdzie mam w nim wstawić z jakiego katalogu ma robić listę?

<?php

function cmpSPLFileInfo( $splFileInfo1, $splFileInfo2 )

{

    return strcmp( $splFileInfo1->getFileName(), $splFileInfo2->getFileName() );

}


class DirList extends RecursiveDirectoryIterator

{

    private $dirArray;


    public function __construct( $p )

    {

        parent::__construct( $p );

        $this->dirArray = new ArrayObject();

        foreach( $this as $item )

        {

            $this->dirArray->append( $item );

        }

        $this->dirArray->uasort( "cmpSPLFileInfo" );

    }


    public function getIterator()

    {

        return $this->dirArray->getIterator();

    }


}

?>

(Airborn) #4

to jest tylko klasa której użyjesz do iterowania po katalogu. wrzucasz ją przykładowo do pliku dirlist.php, w swoim skrypcie dodajesz include i zmieniasz klasę na DirList mniej więcej tak to powinno wyglądać:

DirList.php


(Maryo) #5

Airborn, nie wiem dlaczego, ale nie działa, nadal jest wyświetlane niealfabetycznie :frowning:

myślałem, że to przez includowanie dlatego połączyłem 2 skrypty w jeden, nie pomogło:

<?php

    function cmpSPLFileInfo( $splFileInfo1, $splFileInfo2 )

    {

        return strcmp( $splFileInfo1->getFileName(), $splFileInfo2->getFileName() );

    }

    class DirList extends DirectoryIterator

    {

        private $dirArray;

        public function __construct( $p )

        {

            parent::__construct( $p );

            $this->dirArray = new ArrayObject();

            foreach( $this as $item )

            {

                $this->dirArray->append( $item );

            }

            $this->dirArray->uasort( "cmpSPLFileInfo" );

        }

        public function getIterator()

        {

            return $this->dirArray->getIterator();

        }

    }

    try{

        $str = '
  • '; $di = new DirList('pdf/nowe/A4/'); foreach($di as $file) { if( !$file->isDot() && !$file->isDir() ) $str .= '
  • ['.$file->getFilename().']('.%24file-)'; } $str .= '
    '; echo $str; } catch(Exception $e) { echo $e->getMessage(); } ?>[/code]

(Airborn) #6

maryo , przyznam, że mnie zaskoczyłeś, niestety nie mogę teraz tego nigdzie przetestować, spróbuję więc podsyłać ewentualne rozwiązania które wpadną mi do głowy. Jeżeli masz w miarę nowe php ( >5.2.2) możesz spróbować zamienić

return strcmp( $splFileInfo1->getFileName(), $splFileInfo2->getFileName() );

na

return strcmp( $splFileInfo1->getBasename(), $splFileInfo2->getBasename() );

ew zobaczyć czy zadziała taka wersja:

    <?php
        
        class DirList extends DirectoryIterator
        {
            private $dirArray;
            public function __construct( $p )
            {
                parent::__construct( $p );
                $this->dirArray = new ArrayObject();
                foreach( $this as $item )
                {
                    $this->dirArray->append( $item );
                }
                $this->dirArray->uasort( array($this,'_cmpSPLFileInfo') );
            }
            public function getIterator()
            {
                return $this->dirArray->getIterator();
            }
            private function _cmpSPLFileInfo( $splFileInfo1, $splFileInfo2 )
        {
            return strcmp( $splFileInfo1->getFilename(), $splFileInfo2->getFilename() );
            }
        }
        try{
            $str = '
  • '
    ;             $di = new DirList('pdf/nowe/A4/');             foreach($di as $file)             {                 if( !$file->isDot() && !$file->isDir() )                     $str .= '.$file->getPathname().'">'.$file->getFilename().'';             }             $str .= '';             echo $str;         }         catch(Exception $e)         {         echo $e->getMessage();         }  [/code]

ew. w niej również zamienić getfilename() na getbasename() w tym samym miejscu co wspomniałem wyżej


(Maryo) #7

niestety żadna podpowiedz nie zadziałała :frowning:

a może już ktoś ma - używa gotowe rozwiązanie? przypomnę chodzi o wypisanie plików w katalogu alfabetycznie

-- Dodane 23.01.2009 (Pt) 9:26 --

znalazlem prawidlowy skrypt:

ale nie moge do niego dodac stylu css:

  • bo po wpisaniu w ten sposób nic się nie wyswietla

    print "

    $lista[$i]";[/code]

    działający kod:

[code]<?php $sciezka = "sciezka_go_katalogu_z_plikami"; $lista=array(); $katalog = opendir($sciezka); while ($plik = strtolower(readdir($katalog))) { if ($plik<>"." && $plik<>"..") if(!is_dir($sciezka.$plik)) $lista[]=$plik; } closedir($katalog); sort($lista); for ($i=0;$i { print "$lista[$i]"; } ?>
-- Dodane 23.01.2009 (Pt) 9:46 -- już wszystko ok, problem ze stylami był związany przez cudzysłowy, powinno byc:

$lista[$i]";[/code]

(Airborn) #8

niestety, Twoje rozwiązanie pomimo, że działa, to jest najwolniejsze link postaram się jeszcze dziś coś wykombinować z tym sortowaniem