Pytanie... Czy w tym drzewku może dziecko mieć wielu rodziców czy tylko jednego? Poza tym skoro się interpreter burzy, że nie może stworzyć z obiektu stringa, to czemu nie użyjesz magii w tym wypadku? __toString()

Zdefiniuj sobie tę metodę. Choć ja osobiście użyłbym rekurencji. W funkcji przekazującej strukturę, budowałbym ją. Na jej poziomie bowiem ładnie wiemy co jest dzieckiem czego i jaki efekt? Przypuśćmy, że mamy: rodzic->dziecko->wnuczek, więc robimy:
1. $arr[] = array();
2. Sprawdzamy czy mamy potomka. Jeśli nie to zwrot tablicy.
3. Jeśli tak to tworzymy w rodzicu element o nazwie dziecka i przypisujemy mu array();
4. Wracamy do 2.
Jaki efekt? proszę zobaczyć

Może niezbyt ładnie napisane ale o to lotto

<?php
$sciezka = '[rodzic][dziecko][wnuczek][prawnuczek][praprawnuczek][prapraprawnuczek]'; //przyjąłem jako bazowy string z nazwami, bo nie wiedziałem jak Ty masz to rozwiązane
$sciezka = substr( $sciezka, 1
, -1
); //usuwamy pierwszy i ostatni znak nawiasu ze stringa - są zbędne $sciezka = explode( '][', $sciezka ); //robimy z tego co zostało płaską tablicę, gdzie kolejne elementy to zagnieżdżenia var_dump( $sciezka ); //sam zobacz jak ta tablica wygląda function make_arr( $tab, $index = 0 ) { //parametrami są tablica uzyskana i index kolejnego elementu (do rekurencji)
if( array_key_exists( $index+1
, $tab ) ) { //sprawdzamy czy jest następny element... return array( $tab[ $index ] => make_arr
( $tab, $index+1
) ); //jeśli tak to zwracamy obecny element z rekurencją kolejnego :) } else {
if( array_key_exists( $index, $tab ) ) { //jeśli nie to sprawdzamy czy ktoś nie przeskoczył sobie tablicy i... return array( $tab[ $index ] => array() ); //...jeśli nie to zwracamy pustą tablicę... } else {
throw new Exception( 'Index out of bound!' ); //...albo rzucamy wyjątek :)
}
}
}
$result = null; //ustawiamy zmienną
try {
$result = make_arr( $sciezka, 8 ); //to powinno rzucić wyjątek, bo w przykładzie index osiąga góra 5
} catch (Exception $e) {
echo 'Exception caught: ', $e->getMessage(), "\n"; }
$result = null;
try {
$result = make_arr( $sciezka, 3 ); //to powinno stworzyć tablice licząc od $index = 3 do 5, a więc od prawnuczka do prapraprawnuczka
} catch (Exception $e) {
echo 'Exception caught: ', $e->getMessage(), "\n"; }
$result = null;
try {
$result = make_arr( $sciezka ); //a to zrobi tablicę od rodzica, roota
} catch (Exception $e) {
echo 'Exception caught: ', $e->getMessage(), "\n"; }
Zapomniałem dodac co dostajemy w wyniku

Kod
array
0 => string 'rodzic' (length=6)
1 => string 'dziecko' (length=7)
2 => string 'wnuczek' (length=7)
3 => string 'prawnuczek' (length=10)
4 => string 'praprawnuczek' (length=13)
5 => string 'prapraprawnuczek' (length=16)
Exception caught: Index out of bound!
null
array
'prawnuczek' =>
array
'praprawnuczek' =>
array
'prapraprawnuczek' =>
array
empty
array
'rodzic' =>
array
'dziecko' =>
array
'wnuczek' =>
array
'prawnuczek' =>
array
'praprawnuczek' =>
array
'prapraprawnuczek' =>
array
empty