[SOLVED] Hilfe, Cyber! :-) PHP-Problem!

    • Offizieller Beitrag

    Mein Hirn ist grad wie vernagelt.
    Kannst Du mir meinen Denkfehler in folgendem PHP-Code erklären?


    Ich hab geglaubt, das Ergebnis müsste "wie weiß " lauten. Raus kommt aber "wie weiß hugo " ... :-?
    Dabei sollte $wahr3 doch eigentlich leer bleiben, oder?


    http://sandbox.onlinephpfuncti…4ac1f04fa0fbf67851f90f52a


    • Offizieller Beitrag

    Shit verdammich! Grad selber draufgekommen (gestern um 23:00 hab ichs nimmer gemerkt).


    Die google-Vorlagen, nach denen ich es erstellt hab, hatten alle diesen Fehler drin!!!


    'false' IST NICHT "false" IST NICHT false!


    Wenn ich nämlich die Anführungszeichen rund um false weglasse, gehts!!!


    'false' und "false" sind strings.
    false ist ein Zustand.
    Ähnliches Problem, wie mit meinem array kürzlich ... scheiß Anführungszeichen :)

  • :) Ja, false ist ein boolean und als Eselsbrücke kann man sich quasi merken, alles was du in Hochkommata wrappst, wird zum String. Gibt noch andere Möglichkeiten wie Typecasts, aber das tut der Eselsbrücke keinen Abbruch. Zusätzlich schwer haste es dir gemacht, weil !== im Gegensatz zu != (also ein = weniger) den Typ beider Seiten der Abfrage mit prüft: '1' !== 1 wäre true, wohingegen '1' != 1 false ist.


    Ich bin mir abgesehen davon nicht ganz sicher, was du versuchst zu erreichen. Du suchst nach bestimmten Wörtern im String, und bei Fund setzt du daraus einen anderen String zusammen? 3mal ein strpos auf einen String anzuwenden, ist etwas overpowered. Vielleicht wären reguläre Ausdrücke hier die bessere Wahl, was meist in 'nem Zweizeiler abgefrühstückt wäre. Vielleicht können wir das performant und schön machen. :)

    • Offizieller Beitrag

    Den Beispielcode nutz ich so eh nicht. Ich will damit je gefundenen String eine Javascript-Funktion aufrufen, die eine checkbox setzt.


    Wird ein String gefunden, wird eine Variable auf 'addFunctionXYZ()' gesetzt (bei jedem String auf ne andere Funktion).
    Am Ende kommt dann ein <body onload"..."> mit allen gefunden Funktionen drin.


    An regex hab ich noch nicht gedacht .. das müsste ich ja auch mehrmals auf den String anwenden. Ist das schneller als strpos?
    (An Performance-Engpässe denk ich noch lang nicht bei meinen Skripten *g* Bin schon froh wenns irgendwie gehen!)

  • Das RegExp würdest nur einmal auf den String anwenden, und nur noch durch das Ergebnis ausm PHP-Cache iterieren. Beispiel:


    Was der Code macht. Er durchsucht deinen String nach allen Wörtern, die du im Array $search_words als Key angibst und gibt dann den entsprechenden JS Callback zurück. Wird also 'wie' gefunden, gibt es 'js_callback1' zurück. In Zeile 14 mache ich das mit der imaginären Funktion addJSCallback. Das müsstest du noch nach deinen Gegebenheiten anpassen.


    Der Vorteil hieran wäre, dass du nur noch das Array $search_words mit deinen Suchbegriffen und den dazugehörigen JS-Callbacks befüllen musst. In deinem alten Code musstest du für jedes zusätzliche Wort eine neue Abfrage und einen neuen Aufruf von strpos machen. Jetzt musst du nur noch einen Array um einen Wert erweitern, und der Code bleibt unberührt. Klar, performancetechnisch hat das auf diesem Level kaum messbaren Impact, aber jedes Wort, das du bisher neu hinzugefügt hast mit einer neuen if-Abfrage und strpos-Aufruf, kostet Millisekunden. Langfristig gedacht, bei vielen suchbaren Begriffen irgendwann, macht dann auch Kleinvieh Mist. Wenn deine Seite irgendwann von Facebook gekauft wird, und du hast 1 Mio. suchbare Begriffe, willst keine 1 Mio. strpos abfeuern, glaub mir. :)

    • Offizieller Beitrag

    Hohoho! DAS ist definit kürzer als mein Konstrukt :)
    Dankeschön!
    Werd mal schauen, wie ich das einbauen kann.


    Und bzgl. 1 Mio. Begriffe durchsuchen: das wird nicht passieren :) Hier gehts nur um mein kleines feines Zinnfiguren-Tabletop-Spiel, und die Begriffsliste die ich durchsuche ist fest definiert und bleibt überschaubar. Das werden maximal 20 oder 25 Begriffe, und dabei bleibts.
    Und ob Facebook das aufkauft bezweifel ich .. dann schon eher Pegasus Spiele :D

    • Offizieller Beitrag

    Hmm .. noch ein paar Fragen hätt ich (jetzt hast Du den Salat *g*)


    Wie kann ich in dem search_words-array auch regular expressions verwenden? wenn ich weiß, dass an manchen suchbegriffen ne zahl dran hängt oder ein whitespace in den suchbegriff einbezogen werden soll?
    Also z.B.

    Code
    $str = 'Ach, wie 3, gut, dass, niemand, weiss, dass, ich, rumpel bongo, bin';
    $search_words = array(
    	'wie\s\d' => 'js_callback1',
    	'weiss' => 'js_callback2',
    	'rumpel\sbongo' => 'js_callback3'
    );

    so wie hier abgebildet hats bei mir nicht geklappt.


    EDIT: Ach .. egal. Bin draufgekommen dass ichs gar nicht brauch. Hab einfach 4 preg_match-Abfragen eingebaut für die 4 Werte wo auch Zahlen dran hängen. Problem erledigt.


    Nochmal BIG THX für das coole script! Ist definitiv kürzer als mein strpos-Turm zu Babel :)

  • Da mein RegExp nach Worten splittet, sind Suchstrings mit Leerzeichen nicht vorgesehen, da jedes Wort einzeln betrachtet wird. Da sieht's eher schlecht aus, befürchte ich, mit diesem Ansatz.
    Bin gerade am Tablet, aber ich schau morgen mal. :)