Moi Drodzy,
Po całym dniu siedzenia w rekurencjach i strukturach drzewiastych, które są dla mojej wyobraźni... nazwijmy to - przestrzennej :) -kolosalnym wyzwaniem, muszę się zwrócić o pomoc.
Scenariusz:
I. Pobierz strukturę katalogów (odpadają pliki) do tablicy wielowymiarowej z zachowaniem tej struktury, tak aby każdy jej element zawierał informację o swojej ścieżce ("path") i nazwie ("name").
II. Wyświetl tę strukturę jako zagnieżdżone listy UL, gdzie każdy katalog będzie odpowiadał jednemu
<li data-path="$path" data-name="$name"><a>$name</a></li>
Mordowałem się z tym dzisiaj z 6 godzin i choć pewnie można ten scenariusz uprościć, to w przypadku projektu który robię jest najsensowniejszy z pewnych punktów widzenia.
Są fajne snippety w sieci wykorzystujące np. RecursiveDirectoryIterator z SPL'a, wątek w ogóle często wałkowany na StackOverflow.
Moim największym problemem jest kompletny brak możliwości podpięcia pod rekord z katalogiem dodatkowych informacji, ponieważ wszystkie znalezione rozwiązania bazują na kluczach tablicy jako nazwach katalogów np.
$wynik = array('katalog1' => array('katalog1.1','katalog1.2'),'katalog2','katalog3');
... wtedy wystarczy foreach($wynik as $key=>$value) + if(is_array($value)) { rekurencja } :). To mi daje tylko nazwy. Chcąc rozbudować tablicę o jakieś dodatkowe indeksy ['name'], ['path'] totalnie gubię się na kluczach (teraz już wiem, że o foreach nic nie wiem), a funkcje array_walk i inne wydają się nieodpowiednie do tego zadania.
Ostatni pomysł to było wypełnianie tablicy z obiektami o dwóch właściwościach: ->path i ->name. Ale dziś już 15 razy mi się wydawało, że "z palca" mi wyszło coś genialnego, a jednak to zupełnie nie działało ...
Wpadłem na własne życzenie w te drzewa, a inne tickety czekają :/. Będę ogromnie wdzięczny za pomoc!
--
Edit: Teraz myślę, że może to najlepiej oprzeć o obiektye. Coś na wzór:
class Branch {
public $name;
public $path;
public $depth; // to już trochę dla szpanu
public $children = null;
}
No i iterator by z Branch::children robił tablicę obiektów Branch i tak dalej. Do tego jakaś funkcja wyciągająca to z powrotem i budująca drzewo <UL>
W gruncie rzeczy najbardziej liczę na to, że ktoś z Was miał wcześniej podobne zadanie i ma to już rozpykane :).