Powiedzmy że mamy tablicę do której kluczy zapisujemy liczbę. Problem w tym, że nie wiadomo z góry ile tych kluczy może być po drodze do wartości.
Czyli:
<?php $arr['test'][''] = 4; $arr['test']['lorem'] = 6; $arr['abc']['xyz']['abecadlo']['php'] = 8; // chce pobrac wartosc 8, więc: // zwraca wartosc (docelowo referencje na wartosc) function pobierzWartosc($path) { // ... return $arr[...][...][...][...]; } ?>
Widzę dwa sposoby w jakie można to rozwiązać:
- zastosowanie rekurencji
- wygenerowanie przy pomocy pętli for/foreach stringu ($arr[...][...][...][...]), który potem odpalimy przez eval()
- a może jest jakiś trzeci?
I teraz się zastanawiam która z tych metod okaże się najlepsza pod względem wydajności zarówno dla np. 3 zagnieżdzeń jak i 300.
Zawsze odradzałem używanie eval() ale rekurencja też tutaj może położyć wszystko na łopatki chyba.
---
zaraz będę testował to jakimiś microtime(), ale piszę post bo może jest rozwiązanie inne o którym nie pomyślałem lub ktoś miał już podobny problem.
Na razie mam tak:
<?php function recursive_getValue($arr, $path) { return $v; else { return recursive_getValue($arr[$key], $path); } } function eval_getValue($id, $warianty) { } ?>
Kod
Recursive: 1.83044290543 seconds
Eval: 1.78684926033 seconds
Total Elapsed: 3.61737394333 seconds
Recursive: 51 %
Eval: 49 %
Eval: 1.78684926033 seconds
Total Elapsed: 3.61737394333 seconds
Recursive: 51 %
Eval: 49 %
Oba rozwiązania idą łeb w łeb 50:50 przy 100000 powtórzeń i szukaniu na 4 poziomie tabeli.
Kod
Recursive: 95.8138742447 seconds
Eval: 13.8335242271 seconds
Total Elapsed: 109.64747715 seconds
Recursive: 87 %
Eval: 13 %
Eval: 13.8335242271 seconds
Total Elapsed: 109.64747715 seconds
Recursive: 87 %
Eval: 13 %
No i mamy przewagę oczywiście eval przy 100000 powtózeń i szukaniu na jakimś 70 poziomie tabeli.
Tylko czy niebezpieczeństwo użycia eval jest warte poprawie wydajności?
W moim przypadku nie, bo szukanie będzie odbywało się gdzieś tak maksymalnie do 5 poziomów, a kod funkcji
rekurencyjnej jest bardziej niezawodny.
Ktoś ma jakieś sugestie? Pzdr