phpbar.de logo

Mailinglisten-Archive

[php] Workaround fuer eval gesucht

[php] Workaround fuer eval gesucht

Niels Jäckel niels.jaeckel at silice.de
Son Mar 5 17:04:37 CET 2006


Hallo Norbert,

> es werden verschiedene Test gemacht und deren Ergebnisse stehen
> in in zwei Array's. Nix kompliziertes nur immer 1/0. Dann bastel
> ich daraus einen Querystring der sieht ungefaehr so aus:
> ((0 || 0 || 1) && 1 && 0 && !1 && !1) - Beispiel fuer 'false'
> ((0 || 0 || 1) && 1 && 1 && !0 && !0) - Beispiel fuer 'true'
> Wobei die Anzahl der Elemente beliebig ist.
> 
> Nun faellt mir derzeit jedoch nix ein, wie ich den ResultWert
> des Querys ermitteln koennte, ausser mit Hilfe von eval();
> 
> Hat da jemand eventuell eine Idee dazu ...

ich sage nur: Strukturelle Reduktion

Soll heißen: du reduzierst die Werte immer nach entsprechenden Regeln. 
Da du nur 0 und 1 hast ist das ganze auch recht übersichtlich machbar. 
Du musst halt nur deine logischen Verknüpfungen genau definieren.

!0 -> 1
!1 -> 0
0 || 0 -> 0
1 || 0 -> 1
...

Dann musst du noch mit den Klammern und verkürzten Schreibweisen fertig 
werden:

(a || b || c) -> (a || (b || c))
(a && b && c) -> (a && (b && c))
...
(0) -> 0
(1) -> 1

Das einzige Problem an der Sache ist jeweils das "matching" ob ein 
(Teil-)Ausdruck auf eine Regel passt. Unter [1] habe ich mal einen 
Lamdaterm-Reduzierer (JavaScript) verlinkt. Vielleicht kannst du dir 
dort was abguggen.

Um dir das mal zu demonstrieren, verwende ich eines deiner Beispiele mal 
für eine Demonstration:


   ((0 || 0 || 1) && 1 && 0 && !1 && !1)
= ((0 || (0 || 1)) && 1 && 0 && 0 && 0)
= ((0 || (1)) && (1 && (0 && (0 && 0))))
= ((0 || 1) && (1 && (0 && (0 && 0)))
= (1 && (1 && (0 && (0 && 0))))
= (1 && (1 && (0 && (0))))
= (1 && (1 && (0 && 0)))
= (1 && (1 && (0)))
= (1 && (1 && 0))
= (1 && (0))
= (1 && 0)
= (0)
= 0


Ich denke allerdings, dass das hier viel zu oversized ist und deine 
eval()-Methode viel besser geeignet ist ;-)


Grüße,
Niels

1: http://ellemose.dina.kvl.dk/~sestoft/lamreduce/lamframes.html


P.S.: mit einer funktionalen Programmiersprache wie Haskell wäre sowas 
ganz einfach ;-)

P.P.S.: falls das etwas mit Suchlogik zu tun hat wäre es vielleicht 
einfacher die befragte Datenbank diese Anfrage auflösen zu lassen...

php::bar PHP Wiki   -   Listenarchive