Norbert: Alternative fuer eval(); gesucht ...

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();

  1. 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

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) n4:( ss:) de:] js:| ch:? mo:} zu:)
    <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
    1. 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

      1. 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

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) n4:( ss:) de:] js:| ch:? mo:} zu:)
        <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
        1. 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

          1. Hallo Norbert,

            Da gibts aber auch eine bessere Methode
            hmm,
            es gibt mehr Elend auf der Welt, als sich meine Schulweisheit ertraeumen koennte ... ;-)

            Noch viel mehr... ;-)

            Viele Grüße aus Freiburg,
            Marian

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) n4:( ss:) de:] js:| ch:? mo:} zu:)
            <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
  2. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. 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

    --
    Wer Rechtschreibfehler findet, darf sie behalten.
    1. 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

      1. 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

        --
        Wer Rechtschreibfehler findet, darf sie behalten.
        1. 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

        2. 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

          1. 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

            1. 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

              1. 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

            2. 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

              1. 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