Tablica reprezentująca strukturę katalogów z bajerami :)

0

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 :).

1

To rozumiem, że RecursiveDirectoryIterator już masz opanowany i problem leży w organizacji tablicy?
A takie coś na styl listy głowa + ogon:

array(
	'path',     //string
	'name',     //string
	'children', //array
);

18 minut myślenia: http://scrp.at/bgC
Teraz musisz jeszcze skonstruować odpowiedni iterator, który stworzy zadaną tablicę. W przykładznie dałem proste echo, ale możesz wrzucić listę jako nową tablicę i ponownie po niej iterować.
Rozwiązanie kompletnie nietestowanie, za błędy nie odpowiadam.

Zastosowanie obiektu da pewnie podobny efekt. Można by się pokusić o zaimplementowanie pełnoprawnej listy (is_empty, next, current).

1 użytkowników online, w tym zalogowanych: 0, gości: 1