Was du gemacht hast war einfach die rekursive Lösung. Das ist deutlich langsamer als Iterativ. Allerdings hast du mir eine Idee geben, mit der das ganze noch nen Tick schneller geht:
PHP-Code:
function searchArrayForPathIterative($mda, $path) {
$pathIndex = 0;
// tmp wird zum alias für $mda
$tmp = &$mda;
$pathSize = count($path);
while($pathIndex < $pathSize) {
if(empty($tmp[$path[$pathIndex]])) {
return null;
}
// $tmp wird zum alias von einem teil von $tmp
$tmp = &$tmp[$path[$pathIndex]];
$pathIndex++;
}
return $tmp;
}
Das ganze ist zwar kein "richtiger" Pointer, laut Test aber nochmal schneller und annehmbar. Ich glaube hierbei belassen wir es mal und ich makier das ganze als erledigt. Werde wohl doch irgentwan eine C Lösung Umsetzen müssen, aber die letzte Verbesserung hat nochmal ordentlich was gebracht.
Nachtrag:
@k133: Ich muss den ganzen Pfad durchlaufen (sonst wäre die ganze Aktion eh sinnlos, irgentwie muss ich am Ende ja auch an die Daten kommen oder?). Allerdings kann ich jeweils abbrechen, wenn in einer Ebene der Teil des Pfades nicht da ist.
Deswegen habe ich das ganze im 1. Post auch so beschrieben:
PHP-Code:
$mda[$sa[0]][$sa[1]][$sa[2]] ..... [$sa[n]]
Nachtrag2:
Natürlich könnte ich das ganze auch als richtig großer if-Baum Umsetzen bis zur zum Beispiel 10. Ebene und von da aus dann mit der Iterativen Funktion weiter machen:
PHP-Code:
$pathSize = count($path)
if($pathSize == 1)
return $mda[$path[1]]
elseif($pathSize == 2)
return $mda[$path[1]][$path[2]]
elseif($pathSize == n)
return $mda[$path[1]][$path[2]]....$mda[$path[n]]
else
return iterativeMethode($source,$path)