Jak zrobić, żeby w zmiennej było or albo and


(tomi001) #1

Mam taki problem chce, żeby np $a przechowywała typ działania logicznego jak to zrobić bo ten kod się nie wykonuje.


(B.Andy) #2

Nie wykonuje się, bo jest bez sensu :> Taki kod nawet ciężko by się "czytało". Na moje oko jeśli chciałeś coś takiego zrobić, to coś jest nie tak z warstwą logiczną aplikacji. To na pewno dałoby się lepiej zrobić (pomijając fakt, że w przykładzie sprawdzasz dwa razy ten sam warunek; zakładam, że to tylko przypadek przy pokazywaniu "o co chodzi" - aby nie dawać całego kodu, który masz?). Powiedz może co chciałeś konkretnie osiągnąć?

$wykonaj = false;

        if ($b=="or") {

            if ($aa || $aa)

                $wykonaj = true;

        } else {

            if ($aa && $aa)

                $wykonaj = true;

        }

        if ($wykonaj) {

            //todo

        }

Taki kod jest bez sensu, aczkolwiek działa.


(tomi001) #3

Mi to akurat jest potrzebne bo ja chcę, żeby program tworzył własne zdanie logiczne np.

(((1 and 0) or 1) and 1)

i jak użytkownik wpiszę np. 0 lub 1 to żeby sprawdzał wynik czy to jest poprawne.


(Razi) #4

No to możesz napisać parser.

Ewentualnie coś bardzo niebezpiecznego: funkcja eval.


(tomi001) #5

Właśnie udało mi się napisać skrypt który takie działanie tworzy

po tym linkiem możecie sobie zerknąć

http://178.36.119.116/dzialanie

jak wejdziecie to odświeżcie parę razy stronę żeby się przekonać że to za każdym razem losuje inne zdanie logiczne tylko jest problem on tylko umie tworzyć to zdanie logiczne, a nie umie jego rozwiązywać.

Co miałeś na myśli.


(Razi) #6

Parser, czyli ręcznie lecisz znak po znaku i obliczasz, przyda się ONP.

eval to funkcja którą możesz wykonać dopiero co wygenerowany fragment kodu.

O obu znajdziesz w necie.


(tomi001) #7

Parser to nie jest funkcja i ONP też nie więc co to jest.


(Razi) #8

To może użyj google'i do znalezienia co to jest. Konkretnie zagadnienia:

  • parser wyrażeń logicznych

  • odwrotna notacja polska (ONP)

  • funkcja eval w php


(Frankfurterium) #9

Jeżeli dobrze zrozumiałem niezbyt jasnego pierwszego posta:

http://php.net/manual/pl/functions.vari ... ctions.php


(tomi001) #10

Już to zrobiłem tylko za pomocą funkcji eval()

Dzięki za podpowiedź.


(Marcin Obala) #11

Eval jest wygodne ale :wink: chciałbym zobaczyć co zrobi program jak podsuniemy mu inny plik :wink: może taki z deleteAllFiles :wink:


(Razi) #12

Dlatego wspomniałem że to niebezpieczne, ale jeśli w skrypcie generuje wyrażenie i go używa, nie powinno być problemu.


(Marcin Obala) #13

Ok ok tylko ze ludzie którzy sie "trudnią" włamaniami to wlasnie czekaja tylko na taka okazje :slight_smile:


(kostek135) #14

Idę o piwo, że to jeden input tekstowy z buttonem, zero parsowania czegokolwiek :>

[Dla potomnych jak zrobić to dobrze]

Jak wyżej wspomniał @Razi najlepiej nadaje się do tego Odwrotna Notacja Polska. Jedyna mała niedogodność, to że wyrażenie wejściowe zapewne zostanie zapisane w postaci infiksowej (czytanej od lewej do prawej). Tu warto napomnieć, że koniunkcja ma na ogół niższy priorytet aniżeli alternatywa (niższy priorytet oznacza, że wyrażenie powinno zostać obliczone wcześniej). Istnieje kilka algorytmów zamiany, ale duża część z nich nie radzi sobie z niepełnym nawiasowaniem - to jest taką sytuacją w której nie wszystkie nawiasy występują, bo są rozumiane z kontekstu (tak jak słynne 2+2*2). Jest to odrobinę kłopotliwe, na szczęście prof. Dijkstra zaproponował dość ciekawe i szybkie rozwiązanie tego problemu.