Динамическое перемещение массива в PHP

Я хочу построить иерархию из одномерного массива и может (почти) сделать это с помощью более или менее жесткокодированного кода. Как я могу сделать код динамическим?

Возможно, с while(isset($array[$key])) { ... } ? Или, с дополнительной функцией? Например: $out = my_extra_traverse_function($array,$key);

 function array_traverse($array,$key=NULL) { $out = (string) $key; $out = $array[$key] . "/" . $out; $key = $array[$key]; $out = $array[$key] ? $array[$key] . "/" . $out : ""; $key = $array[$key]; $out = $array[$key] ? $array[$key] . "/" . $out : ""; $key = $array[$key]; $out = $array[$key] ? $array[$key] . "/" . $out : ""; return $out; } $a = Array(102=>101, 103=>102, 105=>107, 109=>105, 111=>109, 104=>111); echo array_traverse($a,104); 

Выход: 107/105/109/111/104

Я ДУМАЮ, что хочу:

 function array_traverse($array, $key = null) { $out = (string) $key; if (isset($array[$key])) { $out = array_traverse($array, $array[$key]) . '/' . $out; } return $out; } 

Или, для нерекурсивного метода:

 function array_traverse($array, $key = null) { $out = (string) $key; while(isset($array[$key])) { $out = $array[$key] . '/' . $out; $key = $array[$key]; } return $out; } 

Да, я бы сказал, что isset() – это путь:

 traverse($array, $value) { $result = array(); while (isset($array[$value])) { array_unshift($result, $value); # or just $result[] = $value if you want to append # instead of prepending $value = $array[$value]; } return $result; # or return implode('/', traverse(array(...))), # but I always prefer array return types in such cases: # they are much more flexible to the users of the function } # BTW: Using implode will avoid having an unnecessary # leading/trailing delimiter (slash in this case) echo implode('/', traverse(array(...)));