Alternative fuer eval(); gesucht ...
Norbert
- php
Hallo,
in den Array's $OR und $AND stehen diverse Test-Ergebnisse:
<?
$query = '('.implode($OR, ' || ').')';
$query = '('.$query.' && '.implode($AND, ' && ').')';
/* danach steht dann in $query sowas wie
((0 || 0 || 1) && 1 && 0 && !1 && !1) - Beispiel fuer 'false'
((0 || 0 || 1) && 1 && 1 && !0 && !0) - Beispiel fuer 'true' */
$commd = "echo ($query) ? 'true' : 'false';";
eval($commd); /* nun wird je nach Query 'true' oder 'false' ausgegeben */
?>
Das funktioniert alles bestens, mich stoert halt nur das eval();
Hallo Norbert,
in den Array's $OR und $AND stehen diverse Test-Ergebnisse:
Es heißt arrays.
Das funktioniert alles bestens, mich stoert halt nur das eval();
Was stört dich daran?
Viele Grüße aus Freiburg,
Marian
Hallo Marian,
in den Array's $OR und $AND stehen diverse Test-Ergebnisse:
Es heißt arrays.
klar, wenn Du das kleinschreibst ... ;-)
Das funktioniert alles bestens, mich stoert halt nur das eval();
Was stört dich daran?
mich, gar nichts - aber,
es gibt garantiert wieder ellenlange Diskussionen, auf die ich keinen Bock habe. Also waere es schoen, wenn mir, Dir oder einem anderen Mensch, eine Alternative einfaellt. Falls nicht, mach ich TipEx an den Monitor, dann sieht's wenigstens niemand ... ;-)
Nette Gruesse Norbert
Hallo Norbert,
in den Array's $OR und $AND stehen diverse Test-Ergebnisse:
Es heißt arrays.
klar, wenn Du das kleinschreibst ... ;-)
Da's außerde'm ;-)
Falls nicht, mach ich TipEx an den Monitor, dann sieht's wenigstens niemand ... ;-)
Da gibts aber auch eine bessere Methode
Viele Grüße aus Freiburg,
Marian
Hallo Marian,
Da gibts aber auch eine bessere Methode
hmm,
es gibt mehr Elend auf der Welt, als sich meine Schulweisheit ertraeumen koennte ... ;-)
Nette Gruesse aus dem Westerwald
Norbert
Hallo Norbert,
Da gibts aber auch eine bessere Methode
hmm,
es gibt mehr Elend auf der Welt, als sich meine Schulweisheit ertraeumen koennte ... ;-)
Viele Grüße aus Freiburg,
Marian
hi,
Du willst also alle Inhalte von $OR mit einem logischen ODER verknüpfen, die von $AND mit einem logischen UND, und beide Ergebnisse anschließend nochmal mit einem UND?
in den Array's $OR und $AND stehen diverse Test-Ergebnisse:
Was heißt das im Klartext?
Enthalten alle Elemente nur true- oder false-Werte?
Wenn sie Ausdrücke enthalten, die erst ausgewertet werden müssen - dann bliebe dir m.E. neben eval nur ein eigener Parser für diese Aufgabe.
gruß,
wahsaga
Hallo Norbert,
wenn ich es richtig verstehe, suchst Du folgendes:
function xxx($a){
foreach($a as $v)
if(!$v) return(FALSE);
return(TRUE);
}
function yyy($a){
$f=FALSE;
foreach($a as $v)
if($v){
$f=TRUE;
break;
}
return($f);
}
echo (yyy($OR) && xxx($AND)) ? 'true' : 'false';
Gruß aus Berlin!
eddi
Hallo eddi,
wenn ich es richtig verstehe, suchst Du folgendes:
im Prinzip JA
aber leider kommt da immer nur TRUE raus, egal was man eingibt.
Aber den Ansatz finde ich gar nicht so schlecht ...
Gruss Norbert
Re:
im Prinzip JA
aber leider kommt da immer nur TRUE raus, egal was man eingibt.
Aber den Ansatz finde ich gar nicht so schlecht ...
was? Das glaube ich Dir nicht. Bitte poste etwas Quellcode!
Gruß aus Berlin!
eddi
Hi,
was? Das glaube ich Dir nicht. Bitte poste etwas Quellcode!
hmm,
was'n fuern Quellcode ...
Habe nur Deinen Code 1:1 uebernommen, und nun steht neben der Ausgabe von eval(); Deine Ausgabe.
Und das fuer 7 Elemente also alle 128 Varianten.
Gruss Norbert
Hallo eddi,
im Prinzip JA
aber leider kommt da immer nur TRUE raus, egal was man eingibt.
Aber den Ansatz finde ich gar nicht so schlecht ...
was? Das glaube ich Dir nicht.
hmm,
wir sind hier aber nicht in der Kirche und ich bin kein Pastor.
D.h. ich will Dir nix einreden und Du musst mir nix glauben, klar ... ;-)
Bitte poste etwas Quellcode!
nicht etwas - alles:
Hier QueryTest laeuft das Script, und hier ist der Code.
Gruss Norbert
gudn tach!
Bitte poste etwas Quellcode!
nicht etwas - alles:
'!0'=='!1'=='0'==0==false
...und deswegen fragte eddi nach deinem code. er vermutete (vermute ich), dass die variablen $OR oder $AND nicht so sind, wie man zunaechst haette annehmen koennen, sie seien es.
die von ihm vorgeschlagenen funktionen koennte man also fuer deine beduerfnisse wie folgt abaendern.
function unden($a){
foreach($a as $v)
if($v===0 || $v==='!1') return(false);
return(true);
}
function odern($a){
foreach($a as $v)
if($v===1 || $v==='!0') return(true);
return(false);
}
das ist uebrigens auch schneller als deine funktionen get_AND() und get_OR(), in denen die schleifen immer bis zum schluss durchlaufen werden. iow: deine funktionen simulieren ein striktes AND bzw. OR, was aber hier ueberfluessig ist.
prost
seth
gudn tach!
'!0'=='!1'=='0'==0==false
das ist _so_ selbstverstaendlich kaese!
gemeint war:
('!0'==0) === ('!1'==0) === ('0'==0) === false
(syntaxhighlighting habe ich mal abgestellt, highlightet naemlich die == falsch hervor; ausserdem darf man das so ja auch gar nicht in php schreiben)
prost
seth
gudn tach!
'!0'=='!1'=='0'==0==false
das ist _so_ selbstverstaendlich kaese!
gemeint war:
('!0'==0) === ('!1'==0) === ('0'==0) === false
nein!
('!0'==0) === ('!1'==0) === ('0'==0) === (false==0) === true
in worten: '!0', '!1', '0', 0 und false sind bei schwachem vergleich (also == statt ===) fuer php gleich.
prost
se*ingridmeister*th
Hi seth,
zu spaet, der Zug ist schon raus aus'm Bahnhof.
Das mit der Zeiteinsparung kaufe ich Dir so einfach nicht ab,
da solltest Du schon eine Demoseite dazu machen.
1*1*1*0*1 ist immer schneller als jedes if
und fuer 1+1+0+0+1 gilt IMHO das gleiche
Trotzdem, vielen Dankl fuer Deine Muehe ...
Gruss Norbert
gudn tach!
Das mit der Zeiteinsparung kaufe ich Dir so einfach nicht ab,
da solltest Du schon eine Demoseite dazu machen.
bitteschoen:
(allerdings weiss ich nicht, inwiefern solche php-benchmarks aussagekraeftig sind, zumal ich keine ahnung habe, wie bspw. funktionsaufrufe intern gehandhabt werden und was intern optimiert wird und was nicht.)
<?php
require_once('Benchmark/Timer.php');
function get_AND($A){
$out = 1;
foreach($A as $val) {
switch($val) {
case '!1': $out *= 0; break;
case '!0': $out *= 1; break;
default: $out *= $val;
}
}
return $out;
}
function get_OR($A) {
$out = 0;
foreach($A as $val) {
$out += $val;
}
return $out;
}
function unden($a){
foreach($a as $v)
if($v===0 || $v==='!1') return(false);
return(true);
}
function odern($a){
foreach($a as $v)
if($v===1 || $v==='!0') return(true);
return(false);
}
$O=array(0, 0, 0);
$A=array(0, 0, '', '');
$timer = new Benchmark_Timer;
echo 'Norberts kram: '."\n";
$timer->setMarker('begin_Norbert');
for($i=0; $i<1000000; ++$i){
$O=array(rand(0, 1), rand(0, 1), rand(0, 1));
$A=array(rand(0, 1), rand(0, 1), '!'.rand(0, 1), '!'.rand(0, 1));
$D = $A;
$D[] = get_OR($O);
$E = get_AND($D);
($E > 0);
}
$timer->setMarker('end_Norbert');
echo 'needed: '.$timer->timeElapsed('begin_Norbert','end_Norbert')." s\n";
echo 'seths kram: '."\n";
$timer->setMarker('begin_seth');
for($i=0; $i<1000000; ++$i){
$O=array(rand(0, 1), rand(0, 1), rand(0, 1));
$A=array(rand(0, 1), rand(0, 1), '!'.rand(0, 1), '!'.rand(0, 1));
(odern($O) && unden($A));
}
$timer->setMarker('end_seth');
echo 'needed: '.$timer->timeElapsed('begin_seth','end_seth')." s\n";
?>
erzeugt bei mir (466 MHz) die ausgabe:
Norberts kram:
needed: 25.188128 s
seths kram:
needed: 15.263572 s
1*1*1*0*1 ist immer schneller als jedes if
erstens stimmt das nicht und zweitens hast eine switch-case-geschichte eingebaut und somit in _jedem_ schleifendurchlauf eine bis drei bedingungen _und_ eine zuweisung _und_ eine multiplikation (in get_AND).
und fuer 1+1+0+0+1 gilt IMHO das gleiche
naja, da das array $OR sowieso nur 3 elemente hat, nimmt sich das an dieser stelle nicht viel. dazu kommt, dass bei get_OR() vorausgesetzt wird, dass $OR nur integer enthalte. ok, wenn das so ist, kann man entsprechend die funktion odern() noch entsprechend abaendern.
wenn man ein grosses array $OR haette, waere die abbruch-bei-fund-methode schneller, da im schnitt bloss ungefaehr zwei schleifen-durchlaeufe gemacht werden muessen.
prost
seth