Autor Zpráva
MartinXYZ
Profil *
Ahoj profíci,

prosím o pomoc někoho znalého v PHP, protože já jsem na to úplně dutej :-).

Potřeboval bych pomoci se skriptem, který vypíše všechny složky a podsložky, které se nacházejí v určeném adresáři. Nikoliv soubory (ty vypsat nechci).

Rád bych, kdyby se to vypisovalo asi takto (a taky aby tam nebyly složky "." a ".."):
Images/
Images/Prvni/
Images/Druha/
Pokus/
Pokus/Prvni/
Pokus/Druha/
Test/
Test/Prvni/
Test/Druha/

Našel by se tu prosím někdo moc ochotný, aby mi s tím pomohl? PHP vážně není můj obor :-).

Děkuji všem,
M.
Taps
Profil
MartinXYZ:
zkus
$root = 'adresar'; //nastavit dle potreby

$objects = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::SELF_FIRST,
    RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
foreach($objects as $name => $object){
   if ($object->isDir()) {
        $paths[] = $object;
    }
}
  foreach($paths as $slozky){
  echo $slozky.'<br>';
  }
MartinXYZ
Profil *
Děkuji za rychlou reakci :-). Ale bohužel skript nefunguje, resp. zkušební stránka, kam jsem ho vložil, se vůbec nenačte. :-(
Taps
Profil
Jakou mas verzi php?
CZghost
Profil
MartinXYZ:
Na PHP skripty potřebuješ serverový program, jako je Apache. Pokud nechceš zakládat nějaký hosting, doporučuju EasyPHP DevServer pro zkušební a vývojářské účely (jiné účely asi mít nebudeš). Na malé zkušební projekty bude stačit obyčejný localhost, pro větší projekty pak doporučuju si doinstalovat Virtual Hosts Manager, který stáhneš ze stránek výrobce. Nejnovější verze VC11 podporuje PHP verze 5, ale je pouze na Windows 7 a 8, pro nižší Windowsy musíš mít verzi VC9. Linuxy už obyčejně mají Apache nainstalovaný, kde ale je, to nevím, Linux nemám, vím o něj jen z internetu, nikdy jsem si ho pořádně neosahal.
MartinXYZ
Profil *
CZghost:
Script jsem nahrál na hosting :-)

Taps:
phpinfo(); říká toto: PHP Version 5.2.17
CZghost
Profil
MartinXYZ:
foreach by měl fungovat s touto verzí, alespoň podle manuálu.
Taps
Profil
MartinXYZ:
Upravil sis promennou root?
MartinXYZ
Profil *
Ano, dal jsem tam:
$root = 'test';

(zkoušel jsem i 'test/', '/test/', './test/' a nic nešlape) :-(

Složka "test" je v kořeni spolu se souborem, ve kterém je Tvůj skript. Ve složce "test" jsou potom zkušební složky a podsložky.
Taps
Profil
A co se ti zobrazi?
MartinXYZ
Profil *
V prohlížeči se zobrazí chybová hláška, že vzdálený soubor nelze nalézt nebo zobrazit. Takhle mi to tam skáče, když třeba v nějakém skriptu mám chybu (třeba zapomenu středník, uzavřít závorku, ...).

Po celém dni hledání na netu jsem našel tento skript:
<?php
$path = realpath('test/');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo $name."<br>";
}
?>

Ten mi funguje. Ale problém je v tom, že zobrazuje celou cestu na serveru, asi takto:
/home/www/adresa.cz/www/sub.adresa.cz/test/
/home/www/adresa.cz/www/sub.adresa.cz/test/images/
/home/www/adresa.cz/www/sub.adresa.cz/test/images/prvni/
/home/www/adresa.cz/www/sub.adresa.cz/test/images/druha/
/home/www/adresa.cz/www/sub.adresa.cz/test/pokus/
/home/www/adresa.cz/www/sub.adresa.cz/test/pokus/prvni/
/home/www/adresa.cz/www/sub.adresa.cz/test/pokus/druha/

To by splňovalo mé požadavky, ale blbá je ta dlouhá cesta. A také je problém v tom, že to vypisuje i soubory, ale já bych chtěl jenom složky a podsložky :-).


Tak ačkoliv jsem nic neměnil, teď mi to u Tvého scriptu vyhodilo chybu:

Fatal error: Undefined class constant 'SKIP_DOTS' in /home/www/................................................


======================================================

Tak všechno jinak, už to funguje, JUCHUUUUUUU :-)

Smazal jsem:
, RecursiveDirectoryIterator::SKIP_DOTS
A už to šlape :-) !!!

Ještě Vás ale poprosím o maličkou radu. Cestu mi to zobrazuje včetně složky "test":
test/Images/
test/Images/Prvni/
test/Images/Druha/

Jak docílím zmizení "test/"?

Děkuji moc :-)
MartinXYZ
Profil *
============================
Vyřešeno, zkrátil jsem to přes "substr()"

Každopádně děkuji pane Tapsi za pomoc :-)
MartinXYZ
Profil *
Ahoj všem,

po delší době znovu otvírám toto téma. Všechno funguje perfektně, skript od Tapse si nemůžu vynachválit. Jen prosím někoho ochotného, aby mi pomohl seřadit výstup podle abecedy :-(, výpis složek je totiž lehce zpřeházený.

Podle návodů na netu jsem zjistil, že musím výsledky načíst do pole a poté je pomocí sort(); seřadit... Ale jelikož PHP rozumím asi tak jako mongolštině a používám ho jen velmi sporadicky, našel by se tu prosím někdo, kdo by mi to vysvětlil trošku polopaticky a pomohl mi? :-)

Předem všem děkuji za ochotu :-)
M.
Taps
Profil
MartinXYZ:
pokud budu vycházet z[#2] Taps
tak úprava bude následující
<?
sort($paths);
 foreach($paths as $slozky){
  echo $slozky.'<br>';
  }

?>
MartinXYZ
Profil *
Tak jsem kód upravil takto:

$root = 'adresar';
 
$objects = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root),
    RecursiveIteratorIterator::SELF_FIRST,
    RecursiveIteratorIterator::CATCH_GET_CHILD
);
foreach($objects as $name => $object){
   if ($object->isDir()) {
        $paths[] = $object;
    }
}
  sort($paths);
  foreach($paths as $slozky){
  echo $slozky.'<br>';
  }

Sice se pořadí složek změnilo, než když tam nebylo "sort($paths);", ale pořád to není dle abecedy. Výsledek je asi takovýto:

adresar/aaa/zzz
adresar/aaa/bbb
adresar/ccc/
adresar/bbb/zzz
adresar/aaa/ddd

Zkrátka jako kdyby to řadilo podle jiného klíče než od A do Z... :-(
Antonin
Profil *
Dej tam misto sort() funkci natcasesort(), to pomuze.
juriad
Profil
Antonin:
Nepomůže, problém je jinde.

MartinXYZ:
To proto, že do toho pole neukládáš cesty, ale objekty a porovnávání na objektech není definované.
Zajímají-li tě jen cesty a nikoli názvy ukládej do pole na 10. řádku $name místo $object.

Chceš-li pak řadit lidštěji, použij zmíněný natcasesort.
MartinXYZ
Profil *
Paráda, děkuju chlapi !!! :-)

Antonínovo řešení překvapivě také funguje, ale pro jistotu jsem použil řešení juriada, takto:

$root = 'adresar';
 
$objects = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root),
    RecursiveIteratorIterator::SELF_FIRST,
    RecursiveIteratorIterator::CATCH_GET_CHILD
);
foreach($objects as $name => $object){
   if ($object->isDir()) {
        $paths[] = $name;
    }
}
  sort($paths);
  foreach($paths as $slozky){
  echo $slozky.'<br>';
  }

Každopádně děkuji všem za pomoc, teď už to funguje přesně dle mých představ. :-)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: