Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Znak działania jako zmienna
Forum PHP.pl > Forum > Przedszkole
squall
Męczę się z tym już chwilę i nie wiem jak to zrobić.

Mam tablicę $rr, i wygląda tak:

$rr[0] = (tu jest jakaś liczba naturalna)
$rr[1] = (tu jest znak działania, +, - , * lub /)
$rr[2] = (tu jest jakaś liczba naturalna)

i nie wiem jak wyliczyć coś takiego. Mam np.

$rr[0] = 5
$rr[1] = -
$rr[2] = 5

no i jak to wyliczyć? Gdy próbuję takiego kodu:

  1. $tt=$rr[0] $rr[1] $rr[2];


to dostaję komunikat o błędzie...

Ma ktoś jakiś pomysł?
SmokAnalog
To jest jedyny przypadek, gdzie bym użył eval.
  1. $tt = eval(implode($rr));
squall
Takie wywołanie powoduje błąd:

  1. $tt = eval(implode($rr));


Parse error: syntax error, unexpected $end
_Borys_
eval('$a = '.implode($rr).';');

eval('echo '.implode($rr).';');
squall
Właśnie o to mi chodziło. Dzięki wam wszystkim.
b4rt3kk
Bezpieczniej jest zrobić coś takiego:

  1. function policz($x, $y, $znak) {
  2. switch($znak) {
  3. case '*': return ($x*y);
  4. case '/': return ($x/$y);
  5. // itd.
  6. }
  7. }
SmokAnalog
Nie popadajmy w paranoję z tym eval. O ile nie dopuszczamy tam żadnych danych od użytkownika, to eval aż takim złem nie jest, a w tym przypadku jest o wiele czytelniejsze.
Crozin
@SmokAnalog: Użycie evala jest tutaj pod każdym względem złe:
1. Względy bezpieczeństwa. Zawsze lepiej jest z góry wyeliminować zagrożenie niż zabezpieczać się przed nim.
2. Wydajność - pojawienie się tego evala wyklucza możliwość pracy akceleratorów.
3. Nie mam pojęcia jakim cudem potrafisz uznać ten kod za czytelniejszy, skoro z kodu eval(implode($x)) nie wynika absolutnie nic, może on robić niemal wszystko.
4. Użycie evala będzie bardzo utrudniało utrzymanie i rozbudowę kodu. Spróbuj dodać sprawdzenie czy drugi operand nie jest zerem w przypadku dzielenia.

@squall: Kod podany przez @b4rt3kk jest poprawny i to go powinieneś użyć. Chodzi konkretnie o samego switcha, nie musi się to znajdować w osobnej funkcji.
SmokAnalog
Spróbuj za to rozbudować kod ze switchem o możliwość działania na większej ilości liczb wink.gif

Rozumiem Wasze wątpliwości i sam unikam eval, jednak czasem warto się zastanowić czy to nie zakrawa o paranoję. Podobnie jak argument z brakiem akceleratorów - no to po prostu straszne, nie będzie akceleratora przy sumowaniu liczb!
Crozin
Cytat
Spróbuj za to rozbudować kod ze switchem o możliwość działania na większej ilości liczb wink.gif
Do różnych zadań wykorzystuje się różne narzędzia. Wystarczy użyć Google'a (PHP Math Parser) i już mamy gotowe narzędzia.

Co do evala: tracimy akcelerator dla całego pliku czy nawet skryptu.
SmokAnalog
Cytat(Crozin @ 16.08.2013, 21:22:00 ) *
Co do evala: tracimy akcelerator dla całego pliku czy nawet skryptu.

Jak to się dzieje? Nigdy nie słyszałem o tym zjawisku, wytłumacz proszę.
Crozin
@SmokAnalog: Wybacz, bzdurę palnąłem. Tracimy wsparcie akceleratora wyłącznie dla kodu wywoływanego przez eval(), nie dla kodu, który wywołuje eval().
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.